PS: 我真的太喜欢CSDN的智能机器人了,回答了我很多小白的问题.
沐神写一行代码,我恨不得得写5行注释, 哭哭~~~
以下是代码及笔记:
# 通过深度学习框架的高级API能够使实现softmax回归变得更加容易
import torch
from torch import nn
from d2l import torch as d2l
batch_size=256
train_iter,test_iter=d2l.load_data_fashion_mnist(batch_size)
# softmax回归的输出层是一个全连接层
# pytorch不会隐式地调整输入的形状
# 因此,我们定义了展平层flatten, 在线性层前调整网络输入的形状
# Sequential--连续的,按顺序的;依次发生的,相继发生的 ---- 是一个构造器
net=nn.Sequential(nn.Flatten(),nn.Linear(784,10))
# Flatten 就是把任何维度的一个tensor变成2D的tensor, 其中第0维度保留,其他维度全部展成一个向量
# nn.Linear 定义一个线性层
def init_weights(m):
# 这个函数会对每一个Linear做一次比较,如果是Linear的话,就把它的weight进行正态分布初始化,标准差为0.01
if type(m)==nn.Linear:
nn.init.normal_(m.weight,std=0.01)
# 这是一个PyTorch的函数,作用是对模型参数m中的权重weight进行正态分布初始化,标准差为0.01
net.apply(init_weights)
# 这段代码是在 PyTorch 中用于初始化神经网络权重的函数。它会遍历整个神经网络的模型,
# 对每个模型参数应用定义好的初始化函数 init_weights。
# init_weights 是用户自定义的一个函数,用于初始化参数。
# 例如,可以使用 PyTorch 自带的初始化方法,如torch.nn.init.xavier_uniform_(),
# 也可以使用自定义的初始化方法。这个函数可以保证每个模型参数的初始值都是随机的,
# 从而增加训练的多样性,提高模型的泛化能力。
运行结果:
# 在交叉熵损失函数中传递未归一化的预测,并同时计算softmax及其对数
loss=nn.CrossEntropyLoss(reduction='none')
# nn.CrossEntropyLoss() 是一个用于计算分类问题中的损失函数的函数。
# 它将输入和目标值作为输入,计算交叉熵损失。
# 在使用时,我们通常将模型输出的预测值与目标值一起传递给 CrossEntropyLoss() 函数。
# 该函数将计算并返回预测值和目标值之间的交叉熵损失。
# 使用学习率为0.1的小批量随机梯度下降作为优化算法
trainer=torch.optim.SGD(net.parameters(),lr=0.1)
# 这段代码是定义了一个优化器(optimizer),
# 具体来说是随机梯度下降(Stochastic Gradient Descent,SGD)优化器。
# 在使用深度学习模型时,我们需要对模型进行训练,这个过程就需要使用优化器来更新模型的参数,
# 使得模型能够更好地拟合训练数据。
# 在使用 SGD 优化器时,我们需要指定一些参数,比如学习率(learning rate),动量(momentum)等。
# 例如,可以这样定义一个 SGD 优化器:
# optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# 其中,model.parameters() 表示要优化的模型参数,lr=0.01 表示学习率为 0.01,momentum=0.9 表示动量为 0.9。
# 在训练过程中,我们可以使用 optimizer.step() 来更新模型参数,使用 optimizer.zero_grad() 来清空梯度。
# 调用之前定义的训练函数来训练模型
num_epochs=10
d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,trainer)
运行结果: