Keras Deep Learning: escalado de conjuntos de datos de entrada para mejorar el rendimiento de la red neuronal

¡Acostúmbrate a escribir juntos! Este es el noveno día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .

Introducción al escalado de conjuntos de datos de entrada

Escalar un conjunto de datos es un proceso de preprocesamiento de los datos antes de que se entrene la red, en el proceso, limitando el rango de datos en el conjunto de datos para garantizar que no se extiendan en intervalos grandes. Una forma de lograr esto es dividir cada dato en el conjunto de datos por el dato más grande en el conjunto de datos. En general, escalar el conjunto de datos de entrada puede mejorar el rendimiento de las redes neuronales y es uno de los métodos de preprocesamiento de datos más utilizados.

Interpretación razonable del escalado del conjunto de datos

En esta sección, veremos por qué escalar conjuntos de datos puede hacer que las redes neuronales funcionen mejor. Para comprender el efecto de escalar la entrada en la salida, comparamos el rendimiento del modelo cuando el conjunto de datos de entrada no se escala con el rendimiento cuando se escala el conjunto de datos de entrada. Cuando los datos de entrada no están escalados, los valores de sigmoidfunción se muestran en la siguiente tabla:

ingresar Pesos Parcialidad valor sigmoide
255 0.01 0 0.93
255 0.1 0 1.00
255 0.2 0 1.00
255 0.4 0 1.00
255 0.8 0 1.00
255 1.6 0 1.00
255 3.2 0 1.00
255 6.4 0 1.00

En la tabla anterior, incluso si el valor del peso varía entre 0,01 y 6,4, la salida no cambia mucho Sigmoiddespués de Para explicar este fenómeno, primero recordamos Sigmoidel método de cálculo de la función:

output = 1/(1+np.exp(-(w*x + b))
复制代码

donde wes el peso, xes la entrada y bes el valor de sesgo.

sigmoidLa razón por la que la salida no cambia es porque w * xel producto de es grande (principalmente porque es xgrande), lo que hace que el sigmoidvalor siempre caiga sigmoiden la parte saturada de la sigmoidcurva (el valor en la esquina superior derecha o inferior izquierda de la curva). curva se llama la parte saturada). Mientras que si multiplicamos los diferentes valores de peso por un número de entrada más pequeño, el resultado se ve así:

ingresar Pesos Parcialidad valor sigmoide
1 0.01 0 0.50
1 0.1 0 0.52
1 0.2 0 0,55
1 0.4 0 0,60
1 0.8 0 0,69
1 1.6 0 0.83
1 3.2 0 0,96
1 6.4 0 1.00

由于输入值较小,因此上表中的 Sigmoid 输出值会随权重的变化发生改变。

通过此示例,我们了解了缩放输入对数据集的影响,当权重(假设权重不具有较大范围)乘以较小输入值时,使输入数据能够对输出产生足够重要的影响。同样当权重值也很大时,输入值对输出的影响将变得不太重要。因此,我们一般将权重值初始化为更接近零的较小数值。同时,为了获得最佳的权重值,通常设置初始化权重的范围变化不大,比如权重在初始化期间采样介于 -1 和 +1 之间的随机值。

接下来,我们对使用的数据集MNIST进行缩放,并比较使用和不使用数据缩放对性能的影响。

使用缩放后的数据集训练模型

  1. 导入相关的包和 MNIST 数据集:
from keras.datasets import mnist
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.utils import np_utils
import matplotlib.pyplot as plt

(x_train, y_train), (x_test, y_test) = mnist.load_data()
复制代码
  1. 缩放数据集有多种方法。一种方法是将所有数据点转换为 0 到 1 之间的值(通过将每个数据点除以数据集中的最大值,在本例中最大值为 255),展平输入数据集并对其进行缩放,如下所示:
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.
复制代码

另一种流行的数据缩放方法是对数据集进行归一化,以使值转换到 -1 和 +1 之间,方法是用数据平均值减去数据点,然后将得到的结果除以原始数据集的标准差:

X = ( m X ) σ x'=\frac {(\mu -x)} \sigma
  1. 将训练和测试输入的值缩放至 [0, 1] 后,我们将数据集的标签转换为独热编码格式:
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
复制代码
  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'])
复制代码

上述模型与我们在《使用Keras构建神经网络》中构建的模型完全相同,唯一的区别是本节模型将在缩放后的数据集上进行训练。

  1. 拟合模型,如下所示:
history = model.fit(x_train, y_train,
                    validation_data=(x_test, y_test),
                    epochs=50,
                    batch_size=64,
                    verbose=1)
复制代码

La precisión del modelo es de aproximadamente 98.41%, mientras que la precisión del modelo entrenado sin escalar los datos es 97%de aproximadamente . Trazar epochlos trenes y pruebas (el código para trazar el gráfico es exactamente el mismo que se usa en el método de red neuronal original de entrenamiento ):

Supervisión del rendimiento del proceso en ejecución del modelo

Como se puede ver en el gráfico anterior, los cambios en el entrenamiento y las pérdidas de prueba son más graduales en comparación con el modelo entrenado en el conjunto de datos sin escalar. Aunque la red puede reducir el valor de pérdida sin problemas, vemos una gran brecha entre la precisión del entrenamiento y la prueba, lo que sugiere que puede haber un sobreajuste en el conjunto de datos de entrenamiento. El sobreajuste se debe al sobreajuste del modelo a los datos de entrenamiento, lo que da como resultado un rendimiento más bajo en el conjunto de datos de prueba que en el conjunto de datos de entrenamiento y un rendimiento de generalización deficiente.

Además de escalar el conjunto de datos dividiendo el valor por el valor máximo, otros métodos de escalado comúnmente utilizados son los siguientes:

  • normalización min-max
  • normalización media
  • Normalización de la desviación estándar

enlaces relacionados

Keras Deep Learning - Entrenamiento de redes neuronales sin procesar

Supongo que te gusta

Origin juejin.im/post/7085159227785740295
Recomendado
Clasificación