我刚刚为顺序keras模型实现了自定义丢失功能。在损失函数中,我希望得到y_t
的值,Tensor
的{{1}},并使用这些值进行数学运算:
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"]()]]'
中,但是我需要获取值来计算该标签记录的向量,就像你在for循环中看到的一样。
我只想知道如何在loss函数中获取fed K.get_value(y_t_temp)
值,或者如何以另一种方式实现此逻辑。
我在y_t
中保存额外信息的原因是我想生成y_t
数组,其中包含有关列车数据的fed_size的信息。我可以在损失函数之外为所有列车数据生成vectors
数组并将其传递给损失函数,但问题是损失函数每次都使用batch_size列车数据并且batch_size记录是据我所知,从列车数据中随机生成,我不知道如何在损失函数中过滤那些馈送数据的vectors
数组,因此我来到这个解决方案中使vectors
数组成为基于batch_size数据的一些额外信息的丢失函数,我发现没有办法,只能在vectors
中保存额外信息,并获取y_t
的值我可以处理我的问题。所以我真的很感激,如果有任何其他方法可以通过查找损失函数中的馈送数据的索引或通过相应的滤波器{{1}的任何其他方式来过滤y_t
数组以用于馈送列车数据的batch_size以某种方式将数组转换为丢失函数。
我非常感谢您的帮助或任何其他解决方案来实现我的逻辑。