簡體   English   中英

R Keras中的自定義丟失功能

[英]Custom Loss Function in R Keras

我想計算加權均方誤差,其中權重是數據中的一個向量。 我根據堆棧溢出提供的建議編寫了一個自定義代碼。

該功能如下:

weighted_mse <- function(y_true, y_pred,weights){
  # convert tensors to R objects
  K        <- backend()
  y_true   <- K$eval(y_true)
  y_pred   <- K$eval(y_pred)
  weights  <- K$eval(weights)

  # calculate the metric
  loss <- sum(weights*((y_true - y_pred)^2)) 

  # convert to tensor
  return(K$constant(loss))
  }

但是,我不知道如何將自定義函數傳遞給編譯器。 如果有人可以幫助我會很棒。 謝謝。

model      <- model %>% compile(
                loss = 'mse', 
                optimizer = 'rmsprop',
                metrics = 'mse')

問候

我沒有使用Keras和R,但是按照文檔中的示例,可能這應該有效:

weighted_mse <- function(y_true, y_pred, weights){
    K        <- backend()
    weights  <- K$variable(weights)
    # calculate the metric
    loss <- K$sum(weights * (K$pow(y_true - y_pred, 2))) 
    loss
}

metric_weighted_mse <- custom_metric("weighted_mse", function(y_true, y_pred) {
    weighted_mse(y_true, y_pred, weights)
})

model <- model %>% compile(
    loss = 'mse', 
    optimizer = 'rmsprop',
    metrics = metric_weighted_mse)

請注意,我正在使用丟失函數的包裝器,因為它有一個額外的參數。 此外,損失函數將輸入作為張量處理,這就是為什么你應該用K$variable(weights)轉換權K$variable(weights)

你無法eval損失的功能。 這將破壞圖表。

您應該只使用fit方法的sample_weight參數: https//keras.rstudio.com/reference/fit.html

##not sure if this is valid R, but 
##at some point you will call `fit` for training with `X_train` and `Y_train`, 
##so, just add the weights.
history <- model$fit(X_train, Y_train, ..., sample_weight = weights)

這就是全部(不要使用自定義損失)。


只是為了知識 - 傳遞損失函數進行compile

僅適用於采用y_truey_pred函數。 (如果您使用的是sample_weights則沒有必要)

model      <- model %>% compile(
            loss = weighted_mse, 
            optimizer = 'rmsprop',
            metrics = 'mse')

但這不起作用,你需要類似於@spadarian創建的包裝器。

此外,保持數據和權重之間的相關性將非常復雜,因為Keras會分批分割您的數據,也因為數據會被洗牌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM