【动手学习深度学习】逐行代码解析合集
06多层感知机的从零开始实现
视频链接:动手学习深度学习–softmax回归简洁实现
课程主页:https://courses.d2l.ai/zh-v2/
教材:https://zh-v2.d2l.ai/
1、多层感知机
2、从线性到非线性
3、激活函数
ReLU激活函数
ReLU激活函数及其导数
sigmoid函数
sigmoid在隐藏层中已经较少使用, 它在大部分时候被更简单、更容易训练的ReLU所取代。
sigmoid激活函数及其导数
tanh函数
tanh函数的形状类似于sigmoid函数, 不同的是tanh函数关于坐标系原点中心对称。
tanh激活函数及其导数
4、代码
import torch
from torch import nn
from d2l import torch as d2l
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)"====================1、初始化模型参数===================="
# Fashion-MNIST中的每个图像由28*28=784个灰度像素值组成。所有图像共分为10个类别。
# 首先,我们将实现一个具有单隐藏层的多层感知机, 它包含256个隐藏单元。
num_inputs, num_outputs, num_hiddens = 784, 10, 256# normal 和 randn 的区别是normal可以自己设定方差,而randn只是生成
# randn*0.01 等价于 normal(0,0.01)
W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens, requires_grad=True) * 0.01)
b1 = nn.Parameter(torch.zeros(num_hiddens, requires_grad=True))
W2 = nn.Parameter(torch.randn(num_hiddens, num_outputs, requires_grad=True) * 0.01)
b2 = nn.Parameter(torch.zeros(num_outputs, requires_grad=True))params = [W1, b1, W2, b2]
"====================2、实现ReLU激活函数===================="
def relu(X):# a的数据类型和形状与X都相同,只不过元素值都为0a = torch.zeros_like(X)return torch.max(X, a)"====================3、实现模型===================="
# 因为我们忽略了空间结构, 所以我们使用reshape将每个二维图像转换为一个长度为num_inputs的向量。
def net(X):X = X.reshape((-1, num_inputs))H = relu(X@W1 + b1) # 这里“@”代表矩阵乘法return (H@W2 + b2)"====================4、损失函数===================="
loss = nn.CrossEntropyLoss(reduction='none')"====================5、训练===================="
# 多层感知机的训练过程与softmax回归的训练过程完全相同
num_epochs, lr = 10, 0.1
updater = torch.optim.SGD(params, lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)# 为了对学习到的模型进行评估,我们将在一些测试数据上应用这个模型。
d2l.predict_ch3(net, test_iter)
d2l.plt.show()
5、运行结果