# coding=utf-8
import torch
from d2l import torch as d2l
from torch import nn
# softmax的简洁实现
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
# 定义和初始化模型
# pytorch中不会隐式的调整输入的形状
# 因此,我们定义了展平层(flatten),在线性层钱调整网络输入形状
# 下面语句是一个PyTorch神经网络模型的定义,它包含一个顺序模型(Sequential)
# 该模型由两个层组成:Flatten层和Linear层。Flatten层:将输入的多维张量展平为一维张量
# Linear层:全连接层,用于将输入的一维张量映射到输出的一维张量
net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))
# 这段代码是一个初始化权重的函数
def init_weights(m):
if type(m) == nn.Linear: # 判断传入的模块是否为线性层(nn.Linear)
nn.init.normal_(m.weight, std=0.01)
net.apply(init_weights) # 将权重全部应用到NN.MOUDLE上
# 交叉熵损失函数
loss = nn.CrossEntropyLoss()
# 学习率0.1的小批量随机梯度下降来优化算法,net.parameters()用于获取模型中所有参数
trainer = torch.optim.SGD(net.parameters(), lr=0.1)
num_epochs = 10
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
d2l.plt.show()
最后结果由图像动态显示,刚开始跑代码的时候,图像无法动态显示,修改了d2l中的
train_ch3()中Animator中的参数。在Animator中修改add()函数
def add(self, x, y):
# Add multiple data points into the figure
if not hasattr(y, "__len__"):
y = [y]
n = len(y)
if not hasattr(x, "__len__"):
x = [x] * n
if not self.X:
self.X = [[] for _ in range(n)]
if not self.Y:
self.Y = [[] for _ in range(n)]
for i, (a, b) in enumerate(zip(x, y)):
if a is not None and b is not None:
self.X[i].append(a)
self.Y[i].append(b)
self.axes[0].cla()
for x, y, fmt in zip(self.X, self.Y, self.fmts):
self.axes[0].plot(x, y, fmt)
self.config_axes()
plt.draw()
plt.pause(0.001)
display.display(self.fig)
# 通过以下两行代码实现了在PyCharm中显示动图
display.clear_output(wait=True)
在add()函数后,添加show()函数
def show(self):
display.display(self.fig)
最后取消pycharm中setting中的这个选项的勾选,即可显示
最后结果如图