大家好,我是小寒
今天给大家分享一个超强的算法模型,MLP
多层感知机(MLP)是一种前馈人工神经网络,它是最基本的深度学习模型之一,主要用于分类和回归问题。
MLP 由一个输入层、一个或多个隐藏层和一个输出层组成,每层中的神经元通过权重连接。
MLP 的基本结构
输入层
输入层的神经元数目等于输入数据的特征数。
每个神经元代表一个输入特征。
隐藏层
隐藏层可以有一个或多个,每一层包含多个神经元。
每个神经元与前一层的所有神经元连接。
激活函数用于引入非线性,常用的激活函数有 ReLU、Sigmoid 和 Tanh。
输出层
输出预测结果,分类任务中输出层的节点数量通常等于类别数量。
MLP 的工作原理
MLP 的基本工作原理可以概括为以下几个步骤:
- 前向传播
输入数据通过输入层传递到隐藏层,经过激活函数处理后再传递到下一层,直至输出层。
每个连接都有一个权重,通过训练数据来调整这些权重。
- 误差计算
输出层的输出与真实标签进行比较,使用损失函数(如均方误差或交叉熵)计算误差。
- 反向传播
通过链式法则(链式求导)计算损失函数对每个权重的梯度。
通过梯度下降等优化算法更新权重,以最小化损失函数。
- 参数更新
使用计算出的梯度调整模型参数(权重和偏置)以改进模型预测。
数学公式
节点输出计算
\(a^{(l)}_j = f\left(\sum_{i} w^{(l)}_{ji} a^{(l-1)}_i + b^{(l)}_j\right)\)
其中 \(a^{(l)}_j\) 是第 \(l\) 层第 \(j\) 个神经元的输出,\(w^{(l)}_{ji}\) 是连接第 \(l-1\) 层第 \(i\) 个神经元与第 \(l\) 层第 \(j\) 个神经元的权重,\(b^{(l)}_j\) 是第 \(l\) 层第 \(j\) 个神经元的偏置。
损失函数(以均方误差为例)
\(L = \frac{1}{2N} \sum_{n=1}^N (y_n - \hat{y}_n)^2\)
其中 \(N\) 是样本数量,\(y_n\) 是真实值,\(\hat{y}_n\) 是预测值。
权重更新(梯度下降)
$w^{(l)}{ji} \leftarrow w^{(l)}{ji} - \eta \frac{\partial L}{\partial w^{(l)}_{ji}} $
其中 \(\eta\) 是学习率。
案例分享
下面是使 MLP 进行数字识别的完整示例。
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.utils import to_categorical
# 加载数据
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 数据预处理
# 将图像数据从 (num_samples, 28, 28) 转换为 (num_samples, 784)
train_images = train_images.reshape((train_images.shape[0], 28 * 28))
test_images = test_images.reshape((test_images.shape[0], 28 * 28))
# 归一化
train_images = train_images.astype('float32') / 255
test_images = test_images.astype('float32') / 255
# 将标签转换为 one-hot 编码
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
# 构建模型
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dense(10, activation='softmax')) # 10 代表数字类别数量
# 编译模型
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(train_images, train_labels, epochs=10, batch_size=128)
# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f'Test accuracy: {test_acc}')
# 可视化一些结果
predictions = model.predict(test_images)
def plot_image(i, predictions_array, true_label, img):
predictions_array, true_label, img = predictions_array, true_label[i], img[i]
plt.grid(False)
plt.xticks([])
plt.yticks([])
plt.imshow(img.reshape(28, 28), cmap=plt.cm.binary)
predicted_label = np.argmax(predictions_array)
if predicted_label == np.argmax(true_label):
color = 'blue'
else:
color = 'red'
plt.xlabel(f"{predicted_label} ({100*np.max(predictions_array):2.0f}%)", color=color)
# 显示第一个图像及其预测
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(0, predictions[0], test_labels, test_images)
plt.show()
- 数据加载和预处理
从 MNIST 数据集加载数据,将图像从二维转换为一维并进行归一化处理,将标签转换为 one-hot 编码。
- 模型构建
使用 Keras 的 Sequential 模型堆叠两层全连接层,第一层使用 ReLU 激活函数,第二层使用 softmax 激活函数进行多分类。
- 编译
使用 RMSprop 优化器和 categorical_crossentropy 作为损失函数。
- 训练
通过 fit 方法训练模型。
- 评估
在测试数据上评估模型性能,并打印准确率。