我在使用fashion_mnist数据集上的给定代码示例。代码中包含metrics="accuracy"
并能正常运行。每当我将其更改为metrics=tf.keras.metrics.Accuracy()
时,就会出现以下错误:
ValueError: Shapes (32, 10) and (32, 1) are incompatible
我做错了什么?Accuracy()
函数不是相同的吗?
import tensorflow as tffashion_mnist = tf.keras.datasets.fashion_mnist(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()train_images = train_images / 255.test_images = test_images / 255.model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation=tf.keras.activations.relu), tf.keras.layers.Dense(10)])model.compile( optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])model.fit(train_images, train_labels, epochs=10)
回答:
根据这里的文档说明:
当你传递字符串
"accuracy"
或"acc"
时,我们会根据所使用的损失函数和模型输出形状将其转换为tf.keras.metrics.BinaryAccuracy
、tf.keras.metrics.CategoricalAccuracy
或tf.keras.metrics.SparseCategoricalAccuracy
之一。
所以,当你传递"accuracy"
时,它会自动转换为SparseCategoricalAccuracy()
。
因此,你可以像以下方式传递它:
model.compile( optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])# ormodel.compile( optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])