Keras中的排名不匹配

时间:2019-12-06 14:15:07

标签: python keras

我有一种方法可以计算出网络输出层与我在训练过程中输入的目标输入标签之间的损耗。我的代码如下:

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_v2softmax_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)]]

1 个答案:

答案 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的形状(在交叉熵之后),因为类维度可能会错位,所以它可能是一维的。