多层感知机的简洁实现
正如你所期待的,我们可以通过高级API更简洁地实现多层感知机。
import torch #引入torch库
from torch import nn #引入网络模型
from d2l import torch as d2l
读取数据集
我们继续读取Fashion_MNIST数据集,对图片进行分类。
#加载数据集,分别为训练集迭代器和测试集迭代器,迭代器每次加载256个样本
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size=256)
定义模型
与softmax回归的简洁实现相比, 唯一的区别是我们添加了2个全连接层(之前我们只添加了1个全连接层)。 第一层是隐藏层,它包含256个隐藏单元,并使用了ReLU激活函数。 第二层是输出层。
num_imputs = 784 #输入特征个数
num_outputs = 10 #输出类别个数
num_hiddens = 256 #隐层的宽度,即隐单元的个数,256个
"""
定义神经网络模型
nn.Flatten()即降维打击函数,将图片的多维度数据降维为1维
nn.Linear(num_imputs, num_hiddens)定义从输入层到隐藏层的线性模型
nn.ReLU()即激活函数,去除样本数据中的所有负数值
nn.Linear(num_hiddens, num_outputs)定义从隐藏层到输出层的线性模型
"""
net = nn.Sequential(nn.Flatten(),
nn.Linear(num_imputs, num_hiddens),
nn.ReLU(),
nn.Linear(num_hiddens,num_outputs))
#参数权重初始化函数,以正态分布初始化神经网络的参数
def init_weights(m):
if type(m)==nn.Linear:
nn.init.normal_(m.weight, std=0.01)
net.apply(init_weights)
Sequential(
(0): Flatten(start_dim=1, end_dim=-1)
(1): Linear(in_features=784, out_features=256, bias=True)
(2): ReLU()
(3): Linear(in_features=256, out_features=10, bias=True)
)
定义损失函数
这里我们直接使用torch.nn里面的内置损失函数CrossEntropyLoss(),保证数据的稳定性。
#定义内置的交叉熵损失函数
loss = nn.CrossEntropyLoss(reduction='none')
定义优化函数
这里依旧使用小批量梯度下降算法进行模型优化,不断更新神经网络参数。
lr = 0.1 #定义模型学习率为0.1
updater = torch.optim.SGD(net.parameters(), lr) #定义模型优化器
开始训练多层感知机模型
num_epochs = 10 #定义迭代次数为10
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater) #开始训练模型
预测结果
d2l.predict_ch3(net, test_iter, n=10) #预测前10个测试集的图片分类结果