admin管理员组文章数量:1599532
今天在写程序的时候,发现有相应的矩阵形状的不一致发生的报错,具体报错内容如下所示:
从内容之中可以看出来,这个错误是由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
版权声明:本文标题:assertion failed:[Condition x==y did not hold element-wise解决 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728324342a1154236.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论