问题和错误:第一个月
故事:
我被迫实现了一个自定义的损失函数,以处理数据中标签行为"空"的问题-我找不到实现动态输出形状的方法。
A(极小样本输出):
True
[[[0, 1, 0, 0, 0], [0, 0, 0, 0, 0]]
Predict
[[0.1, 0.65, 0.1, 0.1, 0.05], [0.01, .99, 0, 0, 0]]
在这个示例中,第二个项目只是一个填充的空白,因此,我的输入形状是(None,50,300),我的(固定)输出是(None,50,5)。
def myLoss(y_true, y_pred):
intermediate_tensor = tf.math.reduce_sum(tf.abs(y_true), 1)
zero_vector = tf.zeros(shape=(1,1), dtype=tf.int64)
bool_mask = tf.squeeze(tf.not_equal(intermediate_tensor, zero_vector))
print(y_true)
print(y_pred)
print(intermediate_tensor)
print(bool_mask)
omit_true = tf.boolean_mask(y_true, bool_mask)
omit_pred = tf.boolean_mask(y_pred, bool_mask)
loss = tf.keras.losses.CategoricalCrossentropy()
return loss(omit_true, omit_pred)
我只是不知道如何解决这个问题。
2条答案
按热度按时间ny6fqffe1#
你的问题的一个解决方案是特别遵循https://stackoverflow.com/a/48986289/11194702的建议,因为你知道布尔掩码是一维的,你需要用
.set_shape([None])
设置它的形状。7xllpg7q2#
在这里我不想深入到超出我理解范围的细节(也不想解释),损失函数存在于图形模式中,在图形模式中,batch没有维数,因为它还没有定义。
解决方案是使用tf.py_function,它允许您显式调用一个非图形函数(因此您知道那里的维数)。