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在损失函数中获取值,或者如何以另一种方式实现此逻辑。

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

我非常感谢您的帮助或任何其他解决方案来实现我的逻辑。

4

0 回答 0