python - 为什么二进制精度与 Keras 中的 train_on_batch 二进制精度不匹配?
问题描述
BinaryAccuracy
在玩具分类问题中给出的准确度train_on_batch
与 Keras 提供的准确度不同。
这个玩具示例显示了批量训练前后的 BinaryAccuracy。这些并不总是匹配的。完整的可重现代码是:
import numpy as np
from keras.layers import Dense
from keras.models import Model, Sequential
from keras.optimizers import Adam
from keras.layers.advanced_activations import LeakyReLU
## Toy data generation:
n = 80; p=2
X1 = np.concatenate([np.tile(np.array([10]), (n, p)), np.tile(np.array([20]), (n, p))])
y1 = np.concatenate([np.tile(np.array([0]), (n,)), np.tile(np.array([1]), (n,))])
## Seed:
seed_val = 12
import tensorflow as tf
import random as python_random
np.random.seed(seed_val)
python_random.seed(seed_val)
tf.random.set_seed(seed_val)
# define the keras model
def build_model(X, y):
model = Sequential()
model.add(Dense(12, input_dim=p, activation='relu'))
model.add(LeakyReLU(alpha=0.01))
model.add(Dense(1, activation='sigmoid'))
print(model.summary())
return model
## Build and compile
mod = build_model(X1, y1)
mod.compile(loss='binary_crossentropy', optimizer=Adam(learning_rate=0.005), metrics=[tf.keras.metrics.BinaryAccuracy()])
losses = []; accuracies = []; iteration_checkpoints = []
def train(X_train, y_train, iterations, batch_size, sample_interval):
for iteration in range(iterations):
idx = np.random.randint(0, X_train.shape[0], batch_size)
X_batch = X_train[idx]
y_batch = y_train[idx]
## Accuracy before
m = tf.keras.metrics.BinaryAccuracy()
m.update_state(np.expand_dims(y_batch, axis=0), mod.predict(X_batch))
## Train on batch:
d_loss, accuracy = mod.train_on_batch(X_batch, y_batch)
## Accuracy after
m2 = tf.keras.metrics.BinaryAccuracy()
m2.update_state(np.expand_dims(y_batch, axis=0), mod.predict(X_batch))
print("%d> Before train: %.5f,\t After train: %.5f,\t\t Accuracy: %.5f%%" %(iteration+1, m.result().numpy(), m2.result().numpy(), accuracy*100))
if (iteration + 1) % sample_interval == 0:
# Save losses and accuracies so they can be plotted after training
losses.append([d_loss, accuracy]); accuracies.append(100.0 * accuracy); iteration_checkpoints.append(iteration + 1)
model_hist = train(X1, y1, iterations=20, batch_size=32, sample_interval=1)
输出有一行:
17> Before train: 0.53125, After train: 0.62500, Accuracy: 100.00000%
- 训练前是
result()
每tf.keras.metrics.BinaryAccuracy
一步训练前的。 - 训练后是
result()
每tf.keras.metrics.BinaryAccuracy
一步训练后的。 - 准确度是命令生成的准确度
train_on_batch
。(增加iterations
代码最后一行中的 会产生更多这种现象。)
为什么会发生这种不匹配?我错过了什么吗?
解决方案
推荐阅读
- amazon-web-services - 无法在 Ubuntu 20.04.1 LTS 中启动 Greengrass 守护程序
- nlp - 如何正确使用 LUIS ML 功能?
- testing - 赛普拉斯:比较两列:列值和日期值
- r - 使用 if_else 或 case_when 语句过滤表以在 R 中查找单行
- javascript - 在 Chrome 扩展程序中使用 ffmpeg.wasm 时出现意外异常
- postgresql - 使用继承创建的外部表卡住
- spring - Hiberatne 尝试为查看实体创建表
- r - 如何基于 R 中分组数据集中的二进制变量创建新变量?
- nginx - Nginx RTMP 分段文件名和时间戳
- reactjs - 强制在开发模式下做出本机反应以重新加载特定文件而不重置所有缓存