1、导入一些相关的包,设置批量大小batch_size
import torch
from torch import nn
from d2l import torch as d2l
#读取256个数据
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
2、设置net和初始化w
# PyTorch不会隐式地调整输入的形状。因此,
# 我们在线性层前定义了展平层(flatten),来调整网络输入的形状
# 注意定义的nn.Sequential nn.Flatten()的作用就是转为2维
# 输入256*28*28 转换为 256*784
net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))
#这里是初始化权重w
def init_weights(m):
if type(m) == nn.Linear:
#均值为0 方差为1
nn.init.normal_(m.weight, std=0.01)
net.apply(init_weights);
3、调用交叉熵损失函数
#交叉熵损失函数,并同时计算softmax后的置信度
#softmax的过程运用了y_hat=softmax(w*x+b)
loss = nn.CrossEntropyLoss(reduction='none')
4、选择小批量梯度下降
#net.parameters() 在SGD里传入所有的参数 学习率lr=0.1
trainer = torch.optim.SGD(net.parameters(), lr=0.1)
5、设置迭代次数,进行训练
#使用已经分装好的API
num_epochs = 10
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
6、进行预测,这里n取20可以看到一些错误分类
def predict_ch3(net, test_iter, n=20): #@save
"""预测标签(定义见第3章)"""
for X, y in test_iter:
break
trues = d2l.get_fashion_mnist_labels(y)
preds = d2l.get_fashion_mnist_labels(net(X).argmax(axis=1))
titles = [true +'\n' + pred for true, pred in zip(trues, preds)]
#这里的reshape还是有点没懂
d2l.show_images(
X[0:n].reshape((n, 28, 28)), 1, n, titles=titles[0:n])
predict_ch3(net, test_iter)
?
|