admin管理员组

文章数量:1599540

今天在写程序的时候,发现有相应的矩阵形状的不一致发生的报错,具体报错内容如下所示:
从内容之中可以看出来,这个错误是由SparseSoftmaxCrossEntropyWithLogits函数引起的,由于调用的损失函数为keras.losses.SparseCategoricalCrossentropy(from_logits=True),所以想到进入损失函数keras.losses.SparseCategoricalCrossentropy的损失函数之中,去查看相应的交叉熵损失函数的输入和输出
进入到sparse_categorical_crossentropy函数之中,查看相应的函数内容

def sparse_categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1):
  """Computes the sparse categorical crossentropy loss.

  Standalone usage:

  >>> y_true = [1, 2]
  >>> y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]
  >>> loss = tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred)
  >>> assert loss.shape == (2,)
  >>> loss.numpy()
  array([0.0513, 2.303], dtype=float32)

  Args:
    y_true: Ground truth values.
    y_pred: The predicted values.
    from_logits: Whether `y_pred` is expected to be a logits tensor. By default,
      we assume that `y_pred` encodes a probability distribution.
    axis: (Optional) Defaults to -1. The dimension along which the entropy is
      computed.

  Returns:
    Sparse categorical crossentropy loss value.
  """
  print('keras sparse_categorical_crossentropy')
  print('y_true = ')
  print(y_true)
  print('y_pred = ')
  print(y_pred)
  y_pred = ops.convert_to_tensor_v2_with_dispatch(y_pred)
  y_true = math_ops.cast(y_true, y_pred.dtype)
  return backend.sparse_categorical_crossentropy(
      y_true, y_pred, from_logits=from_logits, axis=axis)

发现这里面的y_true = (None,1),y_pred = (None,None,3),比如批次是5,最大长度为128,y_true = (5,1),y_pred = (5,128,3),所以此时维度不同,sparse_categorical_crossentropy的交叉熵的函数的调用必然会出现相应的问题。
解决方法:在前面加上一个对应的网络层

output = keras.layers.Lambda(lambda seq: seq[:,0,:])output

所以这里取出来的为第一维的相应数据,(5,128,3)取出第一个0之后为(5,3),这里想要取出第一维度的数值的原因在于后面维度的数值都有可能是没有达到最大长度的填充数值,但是前面的第一维度的数值没有可能,所以选择抽取出第一维度的数值。

本文标签: conditionfailedAssertionwiseelement