私は自分の損失関数を作成しようとしています:
def custom_mse(y_true, y_pred):
tmp = 10000000000
a = list(itertools.permutations(y_pred))
for i in range(0, len(a)):
t = K.mean(K.square(a[i] - y_true), axis=-1)
if t < tmp :
tmp = t
return tmp
予測ベクトルの順列を作成し、最小の損失を返す必要があります。
"`Tensor` objects are not iterable when eager execution is not "
TypeError: `Tensor` objects are not iterable when eager execution is not enabled. To iterate over this tensor use `tf.map_fn`.
エラー。このエラーの原因を見つけることができません。なぜこうなった?
ヘルありがとう。
y_pred
はテンソル(熱心な実行なしで反復不可能)であり、 itertools.permutations が順列を作成する反復可能要素を期待しているため、エラーが発生しています。また、グラフ作成時にテンソルt
の値が不明であるため、最小損失を計算する部分も機能しません。
テンソルを並べ替える代わりに、インデックスの並べ替えを作成し(これはグラフ作成時に実行できます)、並べ替えられたインデックスをテンソルから収集します。 KerasバックエンドがTensorFlowであり、y_true
/y_pred
が2次元であると仮定すると、損失関数は次のように実装できます。
def custom_mse(y_true, y_pred):
batch_size, n_elems = y_pred.get_shape()
idxs = list(itertools.permutations(range(n_elems)))
permutations = tf.gather(y_pred, idxs, axis=-1) # Shape=(batch_size, n_permutations, n_elems)
mse = K.square(permutations - y_true[:, None, :]) # Shape=(batch_size, n_permutations, n_elems)
mean_mse = K.mean(mse, axis=-1) # Shape=(batch_size, n_permutations)
min_mse = K.min(mean_mse, axis=-1) # Shape=(batch_size,)
return min_mse