machine-learning - 为什么我们应该在 Keras 中标准化深度学习的数据?

标签 machine-learning neural-network deep-learning keras conv-neural-network

我正在 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_1weight_2 可能会被分配有偏差的权重。 weight_2 可能会比 weight_1年龄 带来的影响更重要,而收入 作为一项特征可能会更重要。为了将它们缩放到共同水平,我们可以将它们标准化。例如,我们可以将所有年龄放在 [0,1] 范围内,将所有收入放在 [0,1] 范围内。现在我们可以说,年龄收入 作为一项特征具有同等重要性。

归一化总是会提高准确性吗?

显然,不会。归一化不一定会提高准确性。可能会也可能不会,在你实现之前你永远不会真正知道。同样,这取决于您在训练的哪个阶段应用标准化、是否在每次激活后应用标准化等。

由于归一化,特征值的范围缩小到特定范围,因此可以轻松地在较小范围的值上执行计算。因此,通常模型的训练速度会更快一些。

关于纪元数,只要您的模型不会开始过度拟合,准确性通常会随着纪元数的增加而增加。

<小时/>

对规范化/标准化及相关术语的一个很好的解释是 here .

关于machine-learning - 为什么我们应该在 Keras 中标准化深度学习的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48284427/

相关文章:

python - 为什么在 Keras 中改组验证集会改变模型的性能?

python - Keras 输出层出现意外错误

python-3.x - 如何从已经训练好的 YOLO5 Training Epoch 恢复/继续?

tensorflow - OutputProjectionWrapper 与 RNN 之上的全连接层

python - 训练神经网络时损失值为0

python - 关于 tensorflow 神经网络输入大小的问题

python - Keras:为什么 model.fit() 返回与 model.evaluate() 相同的值?

python - sklearn 中的 SVM 是否支持增量(在线)学习?

machine-learning - 使用 Caffe 进行训练时是否应该对文件列表进行排序?

python - CIFAR-10 无意义的归一化值