共计 2606 个字符,预计需要花费 7 分钟才能阅读完成。
本文为 PyTorch 官网教程中:如何构建神经网络。基于 PyTorch 专门构建神经网络的子模块 torch.nn 构建一个简略的神经网络。
残缺教程运行 codelab
torch.nn 文档
神经网络由对数据执行操作的层 / 模块组成。torch.nn 提供了构建神经网络所需的所有模块。
PyTorch 中的每个模块都是 nn.module 的子类。
在上面的局部中,咱们将构建一个神经网络来进行 10 品种别的分类。
建设神经网络
神经网络由对数据执行操作的层 / 模块组成。torch.nn 提供了构建神经网络所需的所有模块。PyTorch 中的每个模块都是 nn.module 的子类。
在上面的局部中,咱们将构建一个神经网络来进行 10 品种别的分类。
import os
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
加载训练设施
咱们心愿可能在硬件加速器,比方 GPU 上训练咱们的模型。能够通过 torch.cuda 来检测 GPU 是否可用。
device = 'cuda' if torch.cuda.is_available() else 'cpu' #检测 gpu 是否可用,不可用应用 cpu
print('Using {} device'.format(device)) #输入应用设施类型
定义类
咱们通过 nn.Module 来定义神经网络,并在__init__ 中初始化神经网络。每个 nn.Module 子类在 forward 办法中实现对输出数据的操作。
class NeuralNetwork(nn.Module):
def __init__(self): #定义网络结构
super(NeuralNetwork, self).__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),
nn.ReLU())
def forward(self, x): #前向流传
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
在应用模型前须要先实例化模型,并将其挪动到 GPU 上
model = NeuralNetwork().to(device) #实例化模型
print(model)
为了在模型的输出和输入之间创立简单的非线性映射,须要应用非线性的激活函数。
它们在线性变换后引入非线性,帮忙神经网络学习各种各样的简单映射。在这个模型中,咱们在线性层之间应用 nn.ReLU,也能够应用其余激活函数来引入非线性。
X = torch.rand(1, 28, 28, device=device) #生成(1,28,28)的数据
logits = model(X) #向模型输出数据
pred_probab = nn.Softmax(dim=1)(logits) #调用 softmax 将预测值映射为(0,1)间的概率
y_pred = pred_probab.argmax(1) #最大概率对应分类
print(f"Predicted class: {y_pred}")
神经网络各层阐明
接下来,咱们合成网络来具体讲述每一层的性能。
为了阐明这一点,咱们将取小批量的 3 个尺寸为 28×28 的图像样本输出网络
input_image = torch.rand(3,28,28) #生成(3,28,28)的数据
print(input_image.size())
nn.Flatten 层
Flatten 层用来把多维的输出一维化,罕用在从卷积层到全连贯层的过渡。
nn.Flatten 层,能够将每个 28×28 图像转换 784 ($28\times 28=784$) 个像素值的间断数组(批量维度放弃为 3)。
flatten = nn.Flatten()
flat_image = flatten(input_image) #(3,28,28)转换为(3,784)print(flat_image.size())
nn.Linear 层
nn.Linear 层,即线性层,是一个使用权重和偏差对输出数据作线性变换的模块。
layer1 = nn.Linear(in_features=28*28, out_features=20) #输出(3,28*28)输入(3,20)hidden1 = layer1(flat_image)
print(hidden1.size())
nn.ReLU 层
为了在模型的输出和输入之间创立简单的非线性映射,须要应用非线性的激活函数。它们在线性变换后引入非线性,帮忙神经网络学习各种各样的简单映射。
在这个模型中,咱们在线性层之间应用 nn.ReLU,也能够应用其余激活函数来引入非线性。
print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
nn.Sequential 层
神经网络的最初一个线性层返回 logits,即值域区间在 $[-\infty,\infty]$ 中的原始值。这些值传递给 nn.Softmax 模块后,logit 被缩放为 $[0,1]$ 区间中,示意模型对每个类的预测概率。
dim 参数示意每一维度进行运算的地位,运算后果相加为 1。
softmax = nn.Softmax(dim=1)
pred_probab = softmax(logits)
输入模型构造
神经网络中的许多层都是参数化的,即具备相关联的权重和偏差,这些参数在训练中被迭代优化。
子类 nn.Module 主动跟踪模型对象外部定义的所有字段,并应用模型的 parameters() 或 named_parameters() 办法拜访所有参数。
咱们能够通过模型迭代每个参数,并输入其尺寸和值。
print("Model structure:", model, "\n\n")
for name, param in model.named_parameters():
print(f"Layer: {name} | Size: {param.size()} | Values : {param[:2]} \n")
最终输入后果可拜访残缺教程