3.7 softmax回归的简洁实现

Ann- / 2023-05-30 / 原文

1. 导入包,加载Mnist数据集

 2.

代码:

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)

# PyTorch不会隐式地调整输入的形状。因此,
# 我们加入一个Flatten()层展平。Flatten()就是把任何维度的Tensor变成一个2D的tensor
# 第0维度保留,剩下的维度全部展成一个向量
net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))

#init_weights这个函数会对每个layer做一次,m就是我们当前的layer
def init_weights(m):
    #如果m是一个nn.Linear
    if type(m) == nn.Linear:
        #那么我们就把它的weight初始化成(均值默认为0)方差为1
        #注意nn.init.normal_()用于以正态分布初始化神经网络某一个层的权重,参数为该层的权重,均值默认为0
        nn.init.normal_(m.weight, std=0.01)
    return

#把init_weights函数应用到我们的net上来
#即按照每一层去跑一下这个函数
net.apply(init_weights);

#定义损失函数为交叉熵损失
#注意reduction='none'表示函数会输出一个形状为 (batch_size, num_classes) 的矩阵(不是batch_size*1的向量?),表示每个样本的每个类别的损失。
loss = nn.CrossEntropyLoss(reduction='none') #定义训练器为梯度下降 trainer = torch.optim.SGD(net.parameters(), lr=0.1) num_epochs = 10 d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)