web-dev-qa-db-ja.com

Tensor`オブジェクトは、積極的な実行が有効になっていない場合は反復できません。このテンソルを反復処理するには、 `tf.map_fn`を使用します

私は自分の損失関数を作成しようとしています:

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`.

エラー。このエラーの原因を見つけることができません。なぜこうなった?

ヘルありがとう。

10
Darlyn

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
10
rvinas