为什么使用分类交叉熵损失函数时会出现"ValueError: Shape mismatch"?



我使用MNIST数据集创建了一个简单的TensorFlow模型(没有卷积层)。我一开始用的是SparseCategoricalCrossentropy损失函数,效果很好。这次我使用CategoricalCrossentropy损耗创建了一个几乎相同的模型,并将标签更改为one-hot编码:

(x_train, y_train), (x_test, y_test) = mnist_data
# scale data:
x_train = x_train / 255
x_test = x_test / 255
# create one-hot encoding:
y_train_one_hot = tf.one_hot(y_train, 10).numpy()
y_test_one_hot = tf.one_hot(y_test, 10).numpy()
# print shapes:
# each image is 28x28; 60,000 examples; 10 possible output values:
print(x_train.shape)  # (60000, 28, 28)
print(y_train.shape)  # (60000, 10)
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(128, activation='relu'),
Dropout(0.2),
Dense(10, activation='softmax')
])
model.compile(
Adam(learning_rate=0.01),
loss='categorical_crossentropy',
metrics=['accuracy']
)
model_history = model.fit(
x_train,
y_train_one_hot,
epochs=20
)

然而,我甚至不能训练模型,因为我得到一个错误:ValueError: Shape mismatch: The shape of labels (received (320,)) should equal the shape of logits except for the last dimension (received (32, 10)).我真的不明白什么形状是错误的或为什么。

编辑:我忘了展示如何设置mnist_data:

mnist_data = tf.keras.datasets.mnist.load_data()

我所做的只是改变了第一行代码

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()

它应该训练。注意你有这行代码

print(y_train.shape)  # (60000, 10)

维度不是(60000,10)而是(60000)。在你对它进行一次热编码后,它将是(60000,10)

相关内容

  • 没有找到相关文章

最新更新