¡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 sigmoid
funció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 Sigmoid
después de Para explicar este fenómeno, primero recordamos Sigmoid
el método de cálculo de la función:
output = 1/(1+np.exp(-(w*x + b))
复制代码
donde w
es el peso, x
es la entrada y b
es el valor de sesgo.
sigmoid
La razón por la que la salida no cambia es porque w * x
el producto de es grande (principalmente porque es x
grande), lo que hace que el sigmoid
valor siempre caiga sigmoid
en la parte saturada de la sigmoid
curva (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进行缩放,并比较使用和不使用数据缩放对性能的影响。
使用缩放后的数据集训练模型
- 导入相关的包和
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()
复制代码
- 缩放数据集有多种方法。一种方法是将所有数据点转换为 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 之间,方法是用数据平均值减去数据点,然后将得到的结果除以原始数据集的标准差:
- 将训练和测试输入的值缩放至
[0, 1]
后,我们将数据集的标签转换为独热编码格式:
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'])
复制代码
上述模型与我们在《使用Keras构建神经网络》中构建的模型完全相同,唯一的区别是本节模型将在缩放后的数据集上进行训练。
- 拟合模型,如下所示:
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 epoch
los 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 ):
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