我有一种方法可以计算出网络输出层与我在训练过程中输入的目标输入标签之间的损耗。我的代码如下:
def get_loss(y_pred, y_true):
y_true = tf.cast(y_true, 'int32')
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y_true, logits=y_pred)
# loss shape : <tf.Tensor 'softmax_cross_entropy_with_logits/Reshape_2:0' shape=(?,) dtype=float32>
mask = tf.cast(tf.not_equal(y_true, 0), 'float32')
loss = tf.reduce_sum(loss * mask, -1) / tf.reduce_sum(mask, -1)
loss = K.mean(loss)
return loss
src_seq_input = Input(shape=(None,), dtype='int32')
# <tf.Tensor 'input_1:0' shape=(?, ?) dtype=int32>
tgt_seq_input = Input(shape=(6,), dtype='int32')
# <tf.Tensor 'input_2:0' shape=(?, 6) dtype=int32>
enc_output = self.model(src_emb, src_seq, active_layers=active_layers)
# <tf.Tensor 'layer_normalization_5/add_1:0' shape=(?, 6) dtype=float32>
loss = get_loss(enc_output, tgt_seq_input)
当我尝试运行代码的最后一行时,出现以下错误:
ValueError:等级不匹配:标签的等级(接收到2)应等于logit等级减去1(接收到2)。
该错误的确切含义是什么,为什么在我的张量组合中可能是错误的?
编辑:
我将cross_entropy从稀疏修改为密集:softmax_cross_entropy_with_logits_v2
或softmax_cross_entropy_with_logits
现在我收到的错误如下:
*** tensorflow.python.framework.errors_impl.InvalidArgumentError:不兼容的形状:[32,6]与[32] [[{{node Equal_1}} =等于[T = DT_INT32,_device =“ / job:localhost /副本:0 / task:0 / device:CPU:0”](_ arg_input_4_0_1,Cast_9)]]
答案 0 :(得分:1)
该错误表示标签(y_true
)的尺寸必须小于对数(y_pred
)的尺寸。
它还表示您的y_pred
是2D,而您的y_true
是2D。
好吧,如果您的y_pred
是2D,那么您的y_true
应该是1D。
看起来您的模型输出了6个类,并且y_pred
的形状为(batch_size, 6)
。因此,您的y_true
的形状必须为(batch_size,)
。
现在,如果您的y_true
很热,则您不应使用“稀疏”,而应使用正常的交叉熵。
请注意loss
的形状(在交叉熵之后),因为类维度可能会错位,所以它可能是一维的。