シーケンシャル keras モデルのカスタム損失関数を実装しました。損失関数ではy_t
、Tensor
フィードされた の値を取得し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
います。
私のロジックを実装するためのあなたの助けや他の解決策に本当に感謝しています.