我正在 Keras 中测试一些网络架构,以对 MNIST 数据集进行分类。我已经实现了一个类似于 LeNet 的方法。
我看到在网上找到的例子中,有一个数据标准化的步骤。例如:
X_train /= 255
我在没有这种标准化的情况下进行了测试,我发现网络的性能(准确性)有所下降(保持相同的纪元数)。为什么会发生这种情况?
如果增加 epoch 的数量,准确率可以达到与归一化训练的模型相同的水平吗?
那么,归一化会影响准确性,还是只影响训练速度?
我的训练脚本的完整源代码如下:
from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
from keras.datasets import mnist
from keras.utils import np_utils
from keras.optimizers import SGD, RMSprop, Adam
import numpy as np
import matplotlib.pyplot as plt
from keras import backend as k
def build(input_shape, classes):
model = Sequential()
model.add(Conv2D(20, kernel_size=5, padding="same",activation='relu',input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(50, kernel_size=5, padding="same", activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(500))
model.add(Activation("relu"))
model.add(Dense(classes))
model.add(Activation("softmax"))
return model
NB_EPOCH = 4 # number of epochs
BATCH_SIZE = 128 # size of the batch
VERBOSE = 1 # set the training phase as verbose
OPTIMIZER = Adam() # optimizer
VALIDATION_SPLIT=0.2 # percentage of the training data used for
evaluating the loss function
IMG_ROWS, IMG_COLS = 28, 28 # input image dimensions
NB_CLASSES = 10 # number of outputs = number of digits
INPUT_SHAPE = (1, IMG_ROWS, IMG_COLS) # shape of the input
(X_train, y_train), (X_test, y_test) = mnist.load_data()
k.set_image_dim_ordering("th")
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
X_train = X_train[:, np.newaxis, :, :]
X_test = X_test[:, np.newaxis, :, :]
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')
y_train = np_utils.to_categorical(y_train, NB_CLASSES)
y_test = np_utils.to_categorical(y_test, NB_CLASSES)
model = build(input_shape=INPUT_SHAPE, classes=NB_CLASSES)
model.compile(loss="categorical_crossentropy",
optimizer=OPTIMIZER,metrics=["accuracy"])
history = model.fit(X_train, y_train, batch_size=BATCH_SIZE, epochs=NB_EPOCH, verbose=VERBOSE, validation_split=VALIDATION_SPLIT)
model.save("model2")
score = model.evaluate(X_test, y_test, verbose=VERBOSE)
print('Test accuracy:', score[1])
最佳答案
标准化是一个通用概念,不仅限于深度学习或 Keras。
为什么要标准化?
让我举一个简单的逻辑回归示例,它很容易理解并解释标准化。 假设我们试图预测是否应该向客户提供贷款。在许多可用的自变量中,我们只考虑年龄和收入。 让方程的形式为:
Y = weight_1 * (Age) + weight_2 * (Income) + some_constant
为了便于解释,让年龄
通常在[0,120]范围内,并假设收入
在[10000, 100000]范围内。 年龄
和收入
的规模有很大不同。如果您按原样考虑它们,则权重 weight_1
和 weight_2
可能会被分配有偏差的权重。 weight_2
可能会比 weight_1
为年龄
带来的影响更重要,而收入
作为一项特征可能会更重要。为了将它们缩放到共同水平,我们可以将它们标准化。例如,我们可以将所有年龄放在 [0,1] 范围内,将所有收入放在 [0,1] 范围内。现在我们可以说,年龄
和收入
作为一项特征具有同等重要性。
归一化总是会提高准确性吗?
显然,不会。归一化不一定会提高准确性。可能会也可能不会,在你实现之前你永远不会真正知道。同样,这取决于您在训练的哪个阶段应用标准化、是否在每次激活后应用标准化等。
由于归一化,特征值的范围缩小到特定范围,因此可以轻松地在较小范围的值上执行计算。因此,通常模型的训练速度会更快一些。
关于纪元数,只要您的模型不会开始过度拟合,准确性通常会随着纪元数的增加而增加。
<小时/>对规范化/标准化及相关术语的一个很好的解释是 here .
关于machine-learning - 为什么我们应该在 Keras 中标准化深度学习的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48284427/