【问题标题】:Why is 'metrics = tf.keras.metrics.Accuracy()' giving an error but 'metrics=['accuracy']' isn't?为什么 'metrics = tf.keras.metrics.Accuracy()' 给出错误但 'metrics=['accuracy']' 没有?
【发布时间】:2021-09-17 06:44:29
【问题描述】:

我在 fashion_mnist 数据集上使用给定的代码示例。它包含metrics="accuracy" 并贯穿始终。每当我将其更改为 metrics=tf.keras.metrics.Accuracy() 时,都会出现以下错误:

ValueError: Shapes (32, 10) and (32, 1) are incompatible

我做错了什么? Accuracy()函数不一样吗?

import tensorflow as tf

fashion_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)

【问题讨论】:

    标签: python tensorflow machine-learning keras


    【解决方案1】:

    基于文档here:

    当您传递字符串"accuracy""acc" 时,我们会根据使用的损失函数和模型输出形状将其转换为tf.keras.metrics.BinaryAccuracytf.keras.metrics.CategoricalAccuracytf.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()])
    # or
    model.compile(
        optimizer=tf.keras.optimizers.Adam(),
        loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
        metrics=['accuracy'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-05
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      相关资源
      最近更新 更多