【发布时间】:2022-01-20 12:25:41
【问题描述】:
已经在 Tensorflow - Keras 中编写了一个基本的深度学习模型。
为什么训练结束时报告的训练集准确度 (0.4097) 与使用 predict 函数(或使用评估,给出相同的数字)直接计算相同的训练数据后直接报告的不同= 0.6463?
MWE 下面;之后直接输出。
from extra_keras_datasets import kmnist
import tensorflow
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.layers import BatchNormalization
import numpy as np
# Model configuration
no_classes = 10
# Load KMNIST dataset
(input_train, target_train), (input_test, target_test) = kmnist.load_data(type='kmnist')
# Shape of the input sets
input_train_shape = input_train.shape
input_test_shape = input_test.shape
# Keras layer input shape
input_shape = (input_train_shape[1], input_train_shape[2], 1)
# Reshape the training data to include channels
input_train = input_train.reshape(input_train_shape[0], input_train_shape[1], input_train_shape[2], 1)
input_test = input_test.reshape(input_test_shape[0], input_test_shape[1], input_test_shape[2], 1)
# Parse numbers as floats
input_train = input_train.astype('float32')
input_test = input_test.astype('float32')
# Normalize input data
input_train = input_train / 255
input_test = input_test / 255
# Create the model
model = Sequential()
model.add(Flatten(input_shape=input_shape))
model.add(Dense(no_classes, activation='softmax'))
# Compile the model
model.compile(loss=tensorflow.keras.losses.sparse_categorical_crossentropy,
optimizer=tensorflow.keras.optimizers.Adam(),
metrics=['accuracy'])
# Fit data to model
history = model.fit(input_train, target_train,
batch_size=2000,
epochs=1,
verbose=1)
prediction = model.predict(input_train)
print("Prediction accuracy = ", np.mean( np.argmax(prediction, axis=1) == target_train))
model.evaluate(input_train, target_train, verbose=2)
最后几行输出:
30/30 [==============================] - 0s 3ms/step - loss: 1.8336 - accuracy: 0.4097
Prediction accuracy = 0.6463166666666667
1875/1875 - 1s - loss: 1.3406 - accuracy: 0.6463
编辑。
下面的初步答案解决了我的第一个问题,指出当您只运行 1 个 epoch 时,批量大小很重要。当运行小批量(或批量 = 1)或更多 epoch 时,您可以将拟合后的预测准确度推到非常接近拟合本身抛出的最终准确度。哪个好!
我最初问这个问题是因为我在处理更复杂的模型时遇到了问题。
我仍然无法理解在这种情况下发生了什么(是的,它涉及批量标准化)。要获得我的 MWE,请将上面“创建模型”下面的所有内容替换为下面的代码,以实现一些具有批量标准化的全连接层。
当您运行两个 epoch 时 - 您会看到所有 30 个小批次的准确度非常稳定(30 因为训练集中的 60,000 除以每批次的 2000)。在整个第二个训练阶段,我看到非常一致的 83% 准确率。
但是拟合后的预测在执行此操作后是糟糕的 10% 左右。谁能解释一下?
model = Sequential()
model.add(Dense(50, activation='relu', input_shape = input_shape))
model.add(BatchNormalization())
model.add(Dense(20, activation='relu'))
model.add(BatchNormalization())
model.add(Flatten())
model.add(Dense(no_classes, activation='softmax'))
# Compile the model
model.compile(loss=tensorflow.keras.losses.sparse_categorical_crossentropy,
optimizer=tensorflow.keras.optimizers.Adam(),
metrics=['accuracy'])
# Fit data to model
history = model.fit(input_train, target_train,
batch_size=2000,
epochs=2,
verbose=1)
prediction = model.predict(input_train)
print("Prediction accuracy = ", np.mean( np.argmax(prediction, axis=1) == target_train))
model.evaluate(input_train, target_train, verbose=2, batch_size = batch_size)
30/30 [==============================] - 46s 2s/step - loss: 0.5567 - accuracy: 0.8345
Prediction accuracy = 0.10098333333333333
【问题讨论】:
标签: python tensorflow machine-learning keras deep-learning