神经网络包括在数据上执行操作的layers/modules。torch.nn命名空间提供建立你自己的神经网络模块。每个模块继承nn.Module。一个神经网络是一个由其他模块(层)组成的模块。这种嵌套的结构考虑到容易建立和管理复杂的架构。
import os import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets, transforms
获取用于训练的设备
在硬件加速器(GPU或MPS)上训练模型,检查torch.cuda或torch.backends.mps是否可用,否则使用CPU。
device = ( "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu" ) print(f"Using {device} device")
定义模型类
通过继承nn.Mudule类,定义神经网络模型类。and在__init__函数中初始化神经网络层。每个nn.Module子类在forward方法里实现在输入数据上的操作。
class NeuralNetwork(nn.Module): def __init__(self): super().__init__() self.flatten = nn.Flatten() self.linear_relu_stack = nn.Sequential( nn.Linear(28*28, 512), nn.ReLU(), nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 10), ) def forward(self, x): x = self.flatten(x) logits = self.linear_relu_stack(x) return logits
创建神经网络实例,并将它移动到device上,并打印其结构。
model = NeuralNetwork().to(device) print(model)
为了使用模型,我们将输入数据传递给它。这样执行模型的forward方法,随之执行背后的操作,并不是直接执行model.forward()。
调用模型,返回2维tensor,dim=0是10个类对应类别的预测值,dim=1对应的每个输出对应的值,通过传递nn.Softmax模块实例获取预测值的可能性。
X = torch.rand(1, 28, 28, device=device) logits = model(X) pred_probab = nn.Softmax(dim=1)(logits) y_pred = pred_probab.argmax(1) print(f"Predicted class: {y_pred}")
模型的层
创建3张28X28大小的图片,看经过每层神经网络发生了什么。

nn.Flatten
nn.Flatten层将2维28X28的图片转换成一个有784个像素值构成的连续数组。(小批量维度(dim=0)被维护的)

nn.Linear
线性层是将一个保存的权重和偏移的线性转换应用到输入上的模块。

nn.ReLu
非线性激活函数是在模型输入和输出之间创建一个复杂的映射。它们在线性转换后被应用去引入非线性,帮助神经网络学习多样化的现象。

nn.Sequential
nn.Sequential是存放一个顺序模块的容器。数据会按照定义的模块顺序传递。

nn.Softmax
神经网络最后一层线性层会返回logits-raw数据,范围[-infty,infty]。经过nn.Softmax模块,logits会被压缩到[0,1],代表着模型对每个类别的预测可能性。dim参数表明维度上的数据和必须为1。

模型参数
神经网络模型里的许多层都是参数化了。比如在训练的过程中,关联的权重和偏移都会被优化。继承nn.Module会自动追踪定义在模型对象中的所有字段。可以通过使用模型的parameters()或named_parameters()方法。

posted on
浙公网安备 33010602011771号