动手学深度学习v2-3.7-学习-条记- 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)
复制代码 分析:引入库,设置批量巨细,加载Fashion MNIST数据集
- torch:PyTorch 是一个盛行的深度学习框架,提供了张量利用、主动求导等功能。
- nn:PyTorch 的神经网络模块,包罗各种神经网络层和模块。
- d2l:d2l 是李沐等人编写的《动手学深度学习》(Dive into Deep Learning)配套的 Python 包。它提供了很多方便的工具函数,包罗数据加载、画图等。
- batch_size:批量巨细(batch size)是指每次练习时输入模子的数据样本数量。这里设置为 256,意味着每次练习时会从数据会集抽取 256 个样本构成一个批量。
- # PyTorch不会隐式地调整输入的形状。因此,
- # 我们在线性层前定义了展平层(flatten),来调整网络输入的形状
- net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))
- def init_weights(m):
- if type(m) == nn.Linear:
- nn.init.normal_(m.weight, std=0.01)
- net.apply(init_weights);
复制代码 分析:界说一个简单的数据集,初始化权重
- nn.Flatten():这是一个展平层,用于将输入数据从多维张量展平为一维张量。比方,对于 Fashion MNIST 数据集,输入图像的形状是 (28, 28),颠末 nn.Flatten() 后,会酿成形状为 (784,) 的一维张量。
- nn.Linear(784, 10):这是一个全毗连层(线性层)。它将输入的 784 个特性(展平后的图像数据)映射到 10 个输出种别(Fashion MNIST 数据集有 10 个种别)。
- if type(m) == nn.Linear:判定当前层是否是全毗连层(nn.Linear)。假如是,则对该层的权重举行初始化
- nn.init.normal_(m.weight, std=0.01):利用正态分布初始化权重。std=0.01 体现权重的初始化尺度差为 0.01。正态分布初始化是一种常见的权重初始化方法,有助于克制梯度消散或爆炸标题。
- loss = nn.CrossEntropyLoss(reduction='none')
复制代码 分析:nn.CrossEntropyLoss 是一个常用的丧失函数,用于多分类标题。它团结了 nn.LogSoftmax 和 nn.NLLLoss(负对数似然丧失)的功能,可以或许盘算模子输出的概率分布与真实标签之间的交错熵丧失。
- trainer = torch.optim.SGD(net.parameters(), lr=0.1)
复制代码 分析:torch.optim.SGD 是 PyTorch 提供的一个优化器类,用于实现随机梯度降落算法。SGD 是一种常用的优化算法,通过迭代更新模子参数,以最小化丧失函数
- net:体现界说好的神经网络模子。
- net.parameters():返回模子中全部可练习的参数(权重和偏置)。这些参数是 PyTorch 的 torch.nn.Parameter 对象,它们会被优化器用来更新模子。
- import torchfrom torch import nnfrom d2l import torch as d2l# 界说网络net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))# 初始化权重def init_weights(m): if type(m) == nn.Linear: nn.init.normal_(m.weight, std=0.01)net.apply(init_weights);# 加载数据集batch_size = 256train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)# 界说丧失函数
- loss = nn.CrossEntropyLoss(reduction='none') # 大概利用 reduction='mean'# 界说优化器
- trainer = torch.optim.SGD(net.parameters(), lr=0.1)# 练习模子num_epochs = 10for epoch in range(num_epochs): net.train() # 将模子设置为练习模式 total_loss = 0.0 for X, y in train_iter: y_hat = net(X) # 前向流传 l = loss(y_hat, y).sum() # 对丧失值求和,使其成为一个标量 l.backward() # 反向流传 trainer.step() # 更新参数 trainer.zero_grad() # 清空梯度 total_loss += l.item() print(f'Epoch {epoch + 1}, Loss: {total_loss / len(train_iter.dataset)}')
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |