Python机器学习之神经网络(三)
本文主要讲解神经网络的优化算法,包括随机梯度下降法和Adam优化算法。我们会在MNIST手写数字识别数据集上进行实验。
1. 随机梯度下降法
随机梯度下降法(stochastic gradient descent,SGD)是一种常用的优化算法。它通过不断迭代,不断更新模型的权重和偏置,使得模型的损失函数不断减小,达到优化的目的。
随机梯度下降法的主要思想是,对于每个训练样本,都计算它的梯度,并根据梯度的方向和大小来更新模型的参数。这种方法可以在遇到大规模数据集时提高训练速度。
下面我们看一个简单的示例。首先,我们加载MNIST数据集,并将像素点的值归一化到0到1之间。
from keras.datasets import mnist
from keras.utils import np_utils
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 28 * 28)
X_test = X_test.reshape(X_test.shape[0], 28 * 28)
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255
Y_train = np_utils.to_categorical(Y_train, 10)
Y_test = np_utils.to_categorical(Y_test, 10)
接着,我们建立一个包含两个隐层的神经网络。其中,每个隐层包含512个神经元,激活函数为ReLU。输出层包含10个神经元,激活函数为Softmax。损失函数为交叉熵,优化算法为SGD。
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=512, input_dim=784, activation='relu'))
model.add(Dense(units=512, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
最后,我们对模型进行训练和评估。
train_history = model.fit(X_train, Y_train, epochs=5, batch_size=32, validation_split=0.2)
scores = model.evaluate(X_test, Y_test)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])
2. Adam优化算法
Adam优化算法是一种基于梯度下降法的自适应学习率优化算法。Adam算法可以自适应地调整每个参数的学习率,从而提高训练的速度和精度。
与SGD不同的是,Adam算法不仅仅考虑了梯度的方向,还考虑了梯度的大小。因此,Adam算法在遇到大规模数据集时,可以更加准确地调整每个参数的学习率。
下面我们看一个示例。首先,我们加载MNIST数据集,并将像素点的值归一化到0到1之间。
from keras.datasets import mnist
from keras.utils import np_utils
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 28 * 28)
X_test = X_test.reshape(X_test.shape[0], 28 * 28)
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255
Y_train = np_utils.to_categorical(Y_train, 10)
Y_test = np_utils.to_categorical(Y_test, 10)
接着,我们建立一个包含两个隐层的神经网络。其中,每个隐层包含512个神经元,激活函数为ReLU。输出层包含10个神经元,激活函数为Softmax。损失函数为交叉熵,优化算法为Adam。
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=512, input_dim=784, activation='relu'))
model.add(Dense(units=512, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
最后,我们对模型进行训练和评估。
train_history = model.fit(X_train, Y_train, epochs=5, batch_size=32, validation_split=0.2)
scores = model.evaluate(X_test, Y_test)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])
以上两个示例差别在于优化算法的选择,另外也有一定的差别在于神经网络的层数和每层的神经元数。根据实际情况,可以适当调整神经网络的参数和优化算法,来获取更好的训练效果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python机器学习之神经网络(三) - Python技术站