1

シーケンシャル keras モデルのカスタム損失関数を実装しました。損失関数ではy_tTensorフィードされた の値を取得しbatch_size、それらの値を使用していくつかの計算を行いたいと考えています。

def lossFunction(y_t, u):
    # 'y_t' shape is (batch_size, 500)
    # 'u' shape is (batch_size, 256) (output of last layer)
    y_t_temp = y_t[:,3:y_t.shape[1]]

    vectors=[] 
    for record in K.get_value(y_t_temp):
        # computeVector is a function that return np array of shape (500, 256) based on the input values
        vectors.append(computeVector(record))
    # the final 'vectors' shape should be (batch_size, 500, 256)
    vectors=np.array(vectors)
    vTens = K.variable(vectors) 
    u = tf.expand_dims(u, axis=K.ndim(u) if 1 == K.ndim(u) - 1 else K.ndim(u))
    dotResult = K.batch_dot(u,vTens,axes=[1,2])
    p = K.exp(dotResult)
    p = tf.reshape(p, [batch_size,500])
    sp = K.sum(p,axis=1)
    sp = K.expand_dims(sp, axis=1)
    sp = K.tile(sp,(1, 500))

    soft = p/sp
    soft=K.clip(soft, 0.0000001, 0.9999999)
    obj = K.categorical_crossentropy(soft, y_t)
    return obj

しかし、この損失関数を使用すると、次のエラーが発生します。

 'You must feed a value for placeholder tensor 'dense_3_target' with dtype float
 [[Node: dense_3_target = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]'

問題が操作にあることはわかっていK.get_value(y_t_temp)ますが、 for ループでわかるように、そのラベル レコードのベクトルを計算するための値を取得する必要があります。

y_t損失関数でフィード値を取得する方法、またはこのロジックを別の方法で実装する方法を知りたいだけです。

追加の情報を保存した理由は、訓練データの供給された batch_size のそれらの情報を含む配列y_tを生成したいからです。vectorsすべての列車データに対して損失関数の外側で配列を生成vectorsし、それを損失関数に渡すことができますが、問題は、損失関数に毎回列車データの batch_size が供給され、batch_size レコードが列車からランダムに生成されることです。私が知っているデータと、損失関数で供給されたデータの配列をフィルタリングする方法がわからないため、batch_size データの追加情報に基づいて損失関数で配列vectorsを作成するこのソリューションにたどり着きました。vectors方法ではなく、その追加情報を保存し、y_t値を取得することによってy_t私は自分の問題を処理できます。vectorsしたがって、損失関数で供給されたデータのインデックスを見つけることによって、訓練データの供給されたbatch_sizeの配列をフィルタリングする他の方法、または対応するフィルタリングされた配列を何らかの方法で損失関数に渡す他の方法があるかどうか、本当に感謝してvectorsいます。

私のロジックを実装するためのあなたの助けや他の解決策に本当に感謝しています.

4

0 に答える 0