bugfix> python > 投稿

Kerasを使用してRでカスタム損失関数を作成する必要があります。 R言語での私の損失関数は簡単です。

lossTradingReturns = function(y_true, y_pred) {
  y_true_diff = na.trim(diff(log(y_true)))
  y_pred_diff = na.trim(diff(log(y_pred)))
  sum( -(sign(y_pred_diff) * y_true_diff) )
}

次のように、RのKerasで翻訳しました。

lossTradingReturns = function(y_true, y_pred) {
   y_true_log = k_log(y_true)
   y_pred_log = k_log(y_pred)
   y_true_diff = y_true_log[2:batch_size] - y_true_log[1:(batch_size-1)]
   y_pred_diff = y_pred_log[2:batch_size] - y_pred_log[1:(batch_size-1)]
   y_true_diff = k_reshape(y_true_diff, (batch_size-1))
   y_pred_diff = k_reshape(y_pred_diff, (batch_size-1))
   return (k_sum( -(k_sign(y_pred_diff) * y_true_diff) ))
}

私の関数は差分(y_t-y_t0)を作成するので、1024個の要素(batch_size)から始めますが、最後には戻り値を計算するための要素が1023個しかありません。 エラーメッセージは、1024が必要であることを示していますが、理由はわかりません:関数はスカラーだけを返す必要があります...

とにかく私が間違っていて、関数の出力が1024テンソルでなければならないのが正しい場合、どうすれば1023テンソルをゼロ値に追加できますか?

前もって感謝します

実行時のエラーメッセージ:

Error in py_call_impl(callable, dots$args, dots$keywords) :
InvalidArgumentError: Input to reshape is a tensor with 1024 values, but the requested shape has 1023
[[Node: loss_19/dense_2_loss/Reshape = Reshape[T=DT_FLOAT, Tshape=DT_INT32, _device="/job:localhost/replica:0/task:0/device:CPU:0"](loss_19/dense_2_loss/Sub, loss_19/dense_2_loss/Reshape_1/shape)]]
Caused by op u'loss_19/dense_2_loss/Reshape', defined at:
File "/home/peroni/.virtualenvs/r-tensorflow/lib/python2.7/site-packages/keras/models.py", line 863, in compile
**kwargs)
File "/home/peroni/.virtualenvs/r-tensorflow/lib/python2.7/site-packages/keras/engine/training.py", line 830, in compile
sample_weight, mask)

コメントを受け取った後の戦略を明確にするために:バッチサンプルは設計上連続していますが、それについて確認するためにチェックしています! (提案をありがとう)。これは、それらを選択するために使用した関数です(shuffle = FALSE)。おそらくあなたは私にそれを確認することができます。

# data — The original array of floating-point data, which you normalized in listing 6.32.
# lookback — How many timesteps back the input data should go.
# delay — How many timesteps in the future the target should be.
# min_index and max_index — Indices in the data array that delimit which timesteps to draw from. This is useful for keeping a segment of the data for validation and another for testing.
# shuffle — Whether to shuffle the samples or draw them in chronological order.
# batch_size — The number of samples per batch.
# step — The period, in timesteps, at which you sample data. You’ll set it 6 in order to draw one data point every hour.
generator = function(data, Y.column=1, lookback, delay, min_index, max_index, shuffle = FALSE, batch_size = 128, step = 6, is_test = FALSE) {
  if (is.null(max_index))
    max_index <- nrow(data) - delay - 1
  i <- min_index + lookback
  function() {
    if (shuffle) {
      rows <- sample(c((min_index+lookback):max_index), size = batch_size)
    } else {
      if (i + batch_size >= max_index)
        i <<- min_index + lookback
      rows <- c(i:min(i+batch_size-1, max_index))
  i <<- i + length(rows)
    }
    samples <- array(0, dim = c(length(rows), 
                                lookback / step,
                                dim(data)[[-1]]-1))
    targets <- array(0, dim = c(length(rows)))
    for (j in 1:length(rows)) {
      indices <- seq(rows[[j]] - lookback, rows[[j]]-1, 
                     length.out = dim(samples)[[2]])
      samples[j,,] <- data[indices, -Y.column]
      targets[[j]] <- data[rows[[j]] + delay, Y.column]
    }            
    if (!is_test)
      return (list(samples, targets))
    else
      return (list(samples))
  }
}

前に微分信号の仮説を評価しました(それらを静止させるために)が、これは私のNN作業戦略を大きく変え、非常に低いパフォーマンスを引き起こします...

回答 1 件
  • エラーは k_reshape で発生します 。ただし、 k_sum のため、損失関数にはこの形状変更ステップは必要ありません。   axis=NULL を離れる場合、テンソルのすべての要素にわたって平均を取る 。

    次の損失関数は私にとってうまく機能します:

    lossTradingReturns = function(y_true, y_pred) {
       y_true_log = k_log(y_true)
       y_pred_log = k_log(y_pred)
       y_true_diff = y_true_log[2:batch_size] - y_true_log[1:(batch_size-1)]
       y_pred_diff = y_pred_log[2:batch_size] - y_pred_log[1:(batch_size-1)]
       return (k_sum( -(k_sign(y_pred_diff) * y_true_diff) ))
    }
    
    

    しかし、この損失関数は非常に奇妙に見えます。データセットはトレーニング中にシャッフルされるため、ミニバッチは各エポックで同じではありません。そのため、損失関数内でyの差を取ることは意味がありません。なぜなら、減算される観測値は完全にランダムだからです。モデルをトレーニングする前に、データセット全体でy変数を一度に区別するべきではありませんか?

あなたの答え