我刚刚为我的顺序 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
在损失函数中获取值,或者如何以另一种方式实现此逻辑。
我保存额外信息的原因y_t
是我想为vectors
训练数据的馈送 batch_size 生成包含这些信息的数组。我可以vectors
为所有火车数据在损失函数之外生成数组并将其传递给损失函数,但问题是损失函数每次都输入了火车数据的 batch_size 并且 batch_size 记录是从火车随机生成的据我所知,我不知道如何vectors
在损失函数中过滤那些馈送数据的数组,因此我来到这个解决方案,vectors
根据 batch_size 数据的一些额外信息在损失函数中制作数组,我发现没有方法,但y_t
通过获取值来保存额外的信息y_t
我可以处理我的问题。所以我真的很感激是否有任何其他方法可以vectors
通过在损失函数中找到馈送数据的索引来过滤训练数据的馈送 batch_size 数组,或者vectors
以某种方式将相应的过滤数组传递给损失函数。
我非常感谢您的帮助或任何其他解决方案来实现我的逻辑。