PyTorch神经网络模型构建

988 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

前言

模型是用于处理输入以生成输出的神经网络层的集合,我们可以使用 torch.nn 包来定义模型,nn 包是提供通用深度学习层的模块集合。nn 的一个模块或层接收输入张量,计算输出张量,并保存权重。我们可以使用两种方法在 PyTorch 中定义模型:nn.Sequentialnn.Module。在本节中,我们将学习如何定义一个线性层、一个两层网络和一个多层卷积网络。

定义线性层

创建一个线性层并打印出它的输出大小:

from torch import nn
input_tensor = torch.randn(64, 1000)
linear_layer = nn.Linear(1000, 100)
output = linear_layer(input_tensor)
print(output.size())

打印出的线性层输出大小如下:

torch.Size([64, 100])

使用 nn.Sequential 定义模型

我们可以使用 nn.Sequential 通过按顺序传递层来创建深度学习模型。例如,下图中展示的两层神经网络:

F1.png

如上图所示,网络有四个节点作为输入,隐藏层中包含五个节点,输出层含有一个节点。接下来,我们将介绍如何实现此双层神经网络。

1. 使用 nn.Sequential 实现上图展示的双层神经网络并打印模型:

from torch import nn
model = nn.Sequential(
    nn.Linear(4, 5),
    nn.ReLU(),
    nn.Linear(5, 1),
)
print(model)

上述代码的输出如下:

Sequential(
    (0): Linear(in_features=4, out_features=5, bias=True)
    (1): ReLU()
    (2): Linear(in_features=5, out_features=1, bias=True)
)

使用 nn.Module 定义模型

PyTorch 中定义模型的另一种方法是使用 nn.Module 类,在类的 __init__ 方法中指定神经网络层。然后,在 forward 方法中,将神经网络层应用于输入。这种方法为构建定制模型提供了更高的灵活性。以如下多层神经网络模型为例:

F2.png

如上图所示,该模型有两个卷积层和两个全连接层。接下来,我们学习如何使用 nn.Module 实现该模型。

1. 首先,实现类(继承自 nn.Module )的主体:

import torch.nn.functional as F
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
    def forward(self, x):
        pass

2. 然后,定义 __init__ 函数:

def __init__(self):
    super(Net, self).__init__()
    self.conv1 = nn.Conv2d(1, 20, 5, 1)
    self.conv2 = nn.Conv2d(20, 50, 5, 1)
    self.fc1 = nn.Linear(4*4*50, 500)
    self.fc2 = nn.Linear(500, 10)

3. 接下来,定义 forward 函数:

def forward(self, x):
    x = F.relu(self.conv1(x))
    x = F.max_pool2d(x, 2, 2)
    x = F.relu(self.conv2(x))
    x = F.max_pool2d(x, 2, 2)
    x = x.view(-1, 4*4*50)
    x = F.relu(self.fc1(x))
    x = self.fc2(x)
    return F.log_softmax(x, dim=1)

4. 然后,覆盖类函数 __init__forward

Net.__init__ = __init__
Net.forward = forward

5. 接下来,创建一个 Net 类的对象并打印模型:

model = Net()
print(model)

以上代码的输出如下:

Net(
    (conv1): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
    (conv2): Conv2d(20, 50, kernel_size=(5, 5), stride=(1, 1))
    (fc1): Linear(in_features=800, out_features=500, bias=True)
    (fc2): Linear(in_features=500, out_features=10, bias=True)
)

将模型移动到 CUDA 设备

模型是参数的集合,默认情况下,模型在 CPU 中运行。

1. 获取模型的设备:

print(next(model.parameters()).device)

以上代码打印结果如下:

cpu

2. 然后,模型移动到 CUDA 设备:

device = torch.device("cuda:0")
model.to(device)
print(next(model.parameters()).device)

相关链接

PyTorch张量操作详解

PyTorch数据加载和处理