python - 何时在分类器神经网络模型中使用“准确度”字符串或 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))
解决方案
看起来,'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]
推荐阅读
- clickhouse - Clickhouse 无法在 red-hat 7.8 上启动,并出现错误“DNS 错误:EAI:不支持主机名的地址系列”
- c# - 从 mysql 反序列化 json 字符串并使用 C#.net 存储到结构中
- windows - 一个人如何成为微软生态系统中知名的软件制造商?
- python - Gensim 3.8.0 到 Gensim 4.0.0
- java - 在 Linux JAVA 上使用 Agora On-Prem 复合录制 SDK 获取原始数据
- node.js - 解密来自 aws KMS 的响应
- python - 如何使用 Azure StorageStreamDownloader 中的 lxml iterparse?
- javascript - 使用 SweetAlert 弹出通知
- c - 我如何将这个为单个 LED 制作的代码转换为我在 arduino 上的 LED 灯条?
- c# - 可以在集成测试中使用模拟或其他存根吗?