¡Acostúmbrate a escribir juntos! Este es el décimo día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .
El efecto del tamaño del lote en la precisión del modelo
En la red neuronal original , usamos el tamaño de lote ( batch size
) para todos los modelos que construimos 64
. En esta sección, estudiaremos el efecto de cambiar el tamaño del lote en la precisión. Para explorar el efecto del tamaño del lote en la precisión del modelo, comparemos dos casos:
- el tamaño del lote es 4096
- el tamaño del lote es 64
Cuando el tamaño del lote es grande, el número de actualizaciones de peso en cada uno epoch
es pequeño. Cuando el tamaño del lote es pequeño epoch
, se realizan múltiples actualizaciones de peso para cada uno, porque en cada uno epoch
, se deben recorrer todos los datos de entrenamiento en el conjunto de datos, por lo que si cada uno se batch
usa para calcular el valor de pérdida con menos datos, hará que cada uno epoch
tenga más Más batch
para recorrer todo el conjunto de datos. Por lo tanto, cuanto batch
menor sea el tamaño, mejor será la precisión del mismo modelo epoch
entrenado . Sin embargo, también debe asegurarse de que el tamaño del lote no sea tan pequeño como para causar un sobreajuste.
En el modelo anterior, usamos un modelo con un tamaño de lote de 64. En esta sección, continuamos usando la misma arquitectura de modelo y solo modificamos el tamaño del lote para el entrenamiento del modelo para comparar el impacto de diferentes tamaños de lote en el rendimiento del modelo. Preprocesar el conjunto de datos y ajustar el modelo:
(x_train, y_train), (x_test, y_test) = mnist.load_data()
num_pixels = x_train.shape[1] * x_train.shape[2]
x_train = x_train.reshape(-1, num_pixels).astype('float32')
x_test = x_test.reshape(-1, num_pixels).astype('float32')
x_train = x_train / 255.
x_test = x_test / 255.
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
model = Sequential()
model.add(Dense(1000, input_dim=num_pixels, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
history = model.fit(x_train, y_train,
validation_data=(x_test, y_test),
epochs=50,
batch_size=4096,
verbose=1)
复制代码
Los únicos cambios en el código son los batch_size
parámetros . Grafique epoch
los trenes y pruebas (el código para trazar el gráfico es exactamente el mismo que se usó para entrenar la red neuronal original ):
在上图中可以注意到,与批大小较小时的模型相比,批大小较大时模型需要训练更多的 epoch
准确率才能达到了 98%。在本节模型中,刚开始的训练阶段,模型准确率相对较低,并且只有在运行了相当多的 epoch
后模型的准确率才能达到较高水平。其原因是,批大小较小时,在每个 epoch
中权重更新的次数要少得多。
数据集总大小为 60000,当我们以批大小为 4096 运行模型 500 个 epoch 时,权重更新进行了 次。当批大小为 64 时,权重更新进行了 次。因此,批大小越小,权重更新的次数就越多,并且通常在 epoch 数相同的情况下,准确率越好。同时,应注意批大小也不能过小,这可能导致训练时间过长以及过拟合情况的出现。