首页 > 解决方案 > 何时在分类器神经网络模型中使用“准确度”字符串或 tf.keras.metrics.Accuracy()

问题描述

我正在学习神经网络,我对指标有疑问。在我正在阅读的书中,它说我可以在 model.compile() 中将字符串或函数的全名用作“指标”,如下所示。我正在使用 Google Colab Research。

model.compile(loss=tf.keras.losses.binary_crossentropy, 
          optimizer=tf.keras.optimizers.Adam(), 
          metrics=["accuracy"])

model.compile(loss=tf.keras.losses.binary_crossentropy, 
          optimizer=tf.keras.optimizers.Adam(), 
          metrics=[tf.keras.metrics.Accuracy()])

但是当我运行 model.evaluate() 时,我总是得到非常不同的数字,例如:

# metrics=tf.keras.metrics.Accuracy()
print(model.evaluate(X_test, y_test))
25/25 [==============================] - 0s 1ms/step - loss: 0.0084 - accuracy: 0.0000e+00
[0.008412548340857029, 0.0]

# metrics="accuracy"
print(model.evaluate(X_test, y_test))
25/25 [==============================] - 0s 1ms/step - loss: 0.0078 - accuracy: 1.0000
[0.00784504134207964, 1.0]

我知道当我重新启动模型时,我会得到不同的随机权重,但在使用完整的函数路径时,我总是得到这个 0.0000e+00。我想知道为什么以及何时使用字符串和完整的函数名。

如下代码:

from  sklearn.datasets          import make_circles
from  sklearn.model_selection   import train_test_split

import tensorflow         as tf

n_samples = 1000
X, y = make_circles(n_samples, noise=0.03, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(10, activation=tf.keras.activations.relu, input_shape=(2,)))
model.add(tf.keras.layers.Dense(10, activation=tf.keras.activations.relu))
model.add(tf.keras.layers.Dense(1, activation=tf.keras.activations.sigmoid))

model.compile(loss=tf.keras.losses.binary_crossentropy, 
              optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), 
              metrics="accuracy")

hist = model.fit(X_train, y_train, epochs=100, verbose=0)

print(model.evaluate(X_test, y_test))

标签: pythontensorflowneural-network

解决方案


看起来,'accuracy'实际上对应tf.keras.metrics.BinaryAccuracy()于这种情况,请参见下面的代码。

from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
import tensorflow as tf

n_samples = 1000
X, y = make_circles(n_samples, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(10, activation=tf.keras.activations.relu, input_shape=(2, )))
model.add(tf.keras.layers.Dense(10, activation=tf.keras.activations.relu))
model.add(tf.keras.layers.Dense(1, activation=tf.keras.activations.sigmoid))

model.compile(
    loss=tf.keras.losses.binary_crossentropy,
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
    metrics=['accuracy', tf.keras.metrics.BinaryAccuracy(name='binary_accuracy')]
)

model.fit(X_train, y_train, epochs=100, verbose=1)
# Epoch 1/100
# 25/25 [==============================] - 0s 678us/step - loss: 0.3403 - accuracy: 0.8562 - binary_accuracy: 0.8562
# Epoch 2/100
# 25/25 [==============================] - 0s 792us/step - loss: 0.3401 - accuracy: 0.8625 - binary_accuracy: 0.8625
# Epoch 3/100
# 25/25 [==============================] - 0s 748us/step - loss: 0.3406 - accuracy: 0.8575 - binary_accuracy: 0.8575
# ....

print(model.evaluate(X_test, y_test))
# [0.5954229235649109, 0.7200000286102295, 0.7200000286102295]

推荐阅读