我为 MNIST 开发了一个基本的分类网络,但在训练过程中,验证准确率 tr,目标是 10% 左右。我尝试过各种优化器(SGD、Adam、Nadam)以及不同的学习率(0.1、1e-3、1e-4、1e-5),但每个时期的验证准确度都保持在 10% 左右。
这是我的代码:
import tensorflow as tf
from tensorflow import keras
(X_train, y_train), (X_test, y_test) = keras.datasets.mnist.load_data()
X_train, X_val = X_train[5000:]/255.0, X_train[:5000]/255.0
y_train, y_val = y_train[5000:]/255.0, y_train[:5000]/255.0
class_NN = keras.models.Sequential([
keras.layers.Input(shape = [28, 28]),
keras.layers.Flatten(),
keras.layers.Dense(300, activation = "relu"),
keras.layers.Dense(100, activation = "relu"),
keras.layers.Dense(10, activation = "softmax")
])
class_NN.compile(loss = "sparse_categorical_crossentropy",
optimizer = keras.optimizers.SGD(learning_rate = 1e-3),
metrics = ["accuracy"])
class_NN.fit(X_train, y_train, epochs = 15,
validation_data = (X_val, y_val))
我在写这个问题的时候,在开始训练之前从代码中取出了
/255.0
。目前,随着我们的训练,验证的准确性正在提高。我的验证准确率达到了 96% 左右。去掉/255.0
后,是什么导致训练时验证准确率提高了?
X_train, X_val = X_train[5000:], X_train[:5000]
y_train, y_val = y_train[5000:], y_train[:5000]
您不需要按照您的方式标准化您的目标值。将 0 到 9 范围内的目标值除以 255.0 是没有意义的。 更改此行:
y_train, y_val = y_train[5000:]/255.0, y_train[:5000]/255.0
到
y_train, y_val = y_train[5000:], y_train[:5000]