多层感知机的从零开始实现
- 获取和读取数据
- 定义模型参数
- 定义激活函数
- 定义模型
- 定义损失函数
- 训练模型
- 小结
我们已经从上一节里了解了多层感知机的原理。下面,我们一起来动手实现一个多层感知机。首先导入实现所需的包或模块。
import torch
import numpy as np
获取和读取数据
这里继续使用Fashion-MNIST数据集。代码和之前softmax回归是一样的,我们将使用多层感知机对图像进行分类。
定义模型参数
我们在3(softmax回归的从零开始实现)里已经介绍了,Fashion-MNIST数据集中图像形状为 28×2828 \times 2828×28,类别数为10。本节中我们依然使用长度为 28×28=78428 \times 28 = 78428×28=784 的向量表示每一张图像。因此,输入个数为784,输出个数为10。实验中,我们设超参数隐藏单元个数为256。
num_inputs, num_outputs, num_hiddens = 784, 10, 256W1 = torch.tensor(np.random.normal(0, 0.01, (num_inputs, num_hiddens)), dtype=torch.float,requires_grad=True)
b1 = torch.zeros(num_hiddens, dtype=torch.float,requires_grad=True)
W2 = torch.tensor(np.random.normal(0, 0.01, (num_hiddens, num_outputs)), dtype=torch.float,requires_grad=True)
b2 = torch.zeros(num_outputs, dtype=torch.float,requires_grad=True)
定义激活函数
这里我们使用基础的max
函数来实现ReLU,而非直接调用relu
函数。
def relu(X):return torch.max(input=X, other=torch.tensor(0.0))
定义模型
同softmax回归一样,我们通过view
函数将每张原始图像改成长度为num_inputs
的向量。然后我们实现上一节中多层感知机的计算表达式。
def net(X):X = X.view((-1, num_inputs))H = relu(torch.matmul(X, W1) + b1)return torch.matmul(H, W2) + b2
定义损失函数
为了得到更好的数值稳定性,我们直接使用PyTorch提供的包括softmax运算和交叉熵损失计算的函数。
loss = torch.nn.CrossEntropyLoss()
训练模型
训练多层感知机的步骤和之前训练softmax回归的步骤没什么区别。
小结
- 可以通过手动定义模型及其参数来实现简单的多层感知机。
- 当多层感知机的层数较多时,本节的实现方法会显得较烦琐,例如在定义模型参数的时候。