导入包和模块
import torch
import numpy as np
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
print(torch.__version__)
获取和读取数据集
调用Fashion-MNIST数据集,利用多元感知机对图像进行分类
batch_size = 256 # 设置批量大小为256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
定义模型参数
# 设置输入神经元个数为784,输出神经元个数为10,隐藏神经元个数为256, 构建两个隐藏层
num_inputs, num_outputs, num_hiddens, num_hiddens2 = 784, 10, 256, 256
# 定义隐藏层权重参数和偏置参数
W1 = torch.tensor(np.random.normal(0, 0.01,(num_inputs, num_hiddens)),
dtype=torch.float)
b1 = torch.zeros(num_hiddens, dtype=torch.float)
W2 = torch.tensor(np.random.normal(0, 0.01,(num_hiddens, num_hiddens2)),
dtype=torch.float)
b2 = torch.zeros(num_hiddens2, dtype=torch.float)
# 定义输出层的权重参数和偏置参数
W3 = torch.tensor(np.random.normal(0, 0.01,(num_hiddens2, num_outputs)),
dtype=torch.float)
b3 = torch.zeros(num_outputs, dtype=torch.float)
# 追踪梯度运算
params = [W1, b1, W2, b2, W3, b3]
for param in params:
param.requires_grad_(requires_grad=True)
定义激活函数
使用max函数来实现ReLU
def relu(X):
return torch.max(input=X, other=torch.tensor(0.0))
定义模型
利用view函数将原始图像转化成长度为num_inputs的向量
def net(X):
X = X.view((-1, num_inputs)) # 将原始图片转化为一维向量
H = relu(torch.matmul(X, W1) + b1)
H2 = relu(torch.matmul(H, W2) + b2)
return torch.matmul(H2, W3) + b3
定义损失函数
使用PyTorch中的softmax运算和交叉熵损失计算函数
loss = torch.nn.CrossEntropyLoss()
训练模型
num_epochs, lr = 5,100.0 # 迭代周期设为5,学习率设为100
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs,batch_size, params, lr)