Pytorch搭建网络模型

这篇博文是参考小土堆的Pytorch的入门视频,主要是通过查询文档的方式讲解如何搭建卷积神经网络,讲解的主要是Pytorch核心包的TORCH.NN中的内容(nn是Neural Network的缩写)

通常我们定义好的网络模型会继承torch.nn.Module 类,该类为我们定义好了神经网络骨架。

 卷积层   Convolution Layers

对于图像处理来说,我们通常使用二维卷积,即使用torch.nn.Conv2d类:

 创建该类时,我们通常只需要传入以下几个参数,其他不常用参数入门时可以不做了解,使用默认值即可,以后需要时再查询文档:

in_channels ( int ) – 输入图像中的通道数     图片通常为3

out_channels ( int ) – 卷积产生的通道数      也是卷积核的个数

kernel_size ( int or tuple ) – 卷积核的大小  传入int表示正方形,传入tuple代表高和宽

stride ( int or tuple , optional ) -- 卷积的步幅。传入int代表横向和纵向步长相同,默认值:1

padding ( int , tuple或str , optional ) – 填充厚度,传入int代表上下左右四个边填充厚度相同,默认为0,即不填充

padding_mode (字符串,可选) – 填充模式,默认为'zeros',即0填充

dilation ( int or tuple , optional ) -- 内核元素之间的间距。默认值:1

groups ( int , optional ) -- 从输入通道到输出通道的阻塞连接数。默认值:1

bias ( bool , optional ) – If True,向输出添加可学习的偏差。默认:True

 卷积操作后输出的张量的高和宽计算公式如下:

其中 input和output中的N代表BatchSize,C代表通道数,H和W代表高和宽,它们不影响H和W的计算,在保持dilation默认值为1的情况下,计算公式可简化为:

池化层

常用的二维最大池化定义在torch.nn.MaxPool2d类中:

创建该类时,我们通常只需要传入以下几个参数,其他不常用参数入门时可以不做了解,使用默认值即可,以后需要时再查询文档:

kernel_size:池化操作时的窗口大小
stride:池化操作时的步长,默认为kernel_size
padding:每个边的填充厚度(0填充)

 池化操作后输出的张量的高和宽计算公式与卷积操作后的计算公式相同。 

非线性激活

常见的ReLU激活定义在torch.nn.ReLU类中:

参数inplace代表是否将ouput直接修改在input中 

线性层

线性层的定义在torch.nn.Linear类中:

 创建线性层使用的参数如下:

in_features:输入特征大小
out_features:输出特征大小
bias:是否添加偏置,默认为True

 模型搭建示例

下图是一个CIFAR10数据集上的分类模型,下面将根据图片进行模型代码的编写。

1.由于 CIFAR10数据集中图片为3*32*32,所以图中模型的输入为3通道,高宽都为32的张量。

2.使用5*5的卷积核进行卷积操作,得到通道数为32,高和宽为32的张量。因此我们可以推出该卷积层的参数如下:

in_channels = 3
out_channels = 32
kernel_size = 5
stride = 1
padding = 2

 注:将 Hin = 32,Hout = 32 以及kernal_size[0]=5三个参数带入:

有:

发现stride[0]= 1和padding[0]=2可以使得等式成立。同理可以得到stride[1]= 1和padding[1]=2

3.使用2*2的核进行最大池化操作,得到通道数为32,高和宽为16的张量。可以推出该池化层的参数如下:

kernel_size = 2
stride = 2
padding = 0

 注:stride和padding推导方式与2中相同。

4.使用5*5的卷积核进行卷积操作,得到通道数为32,高和宽为16的张量。可以推出该池化层的参数如下:

in_channels = 32
out_channels = 32
kernel_size = 5
stride = 1
padding = 2

 5.使用2*2的卷积核进行卷积操作,得到通道数为32,高和宽为8的张量。可以推出该池化层的参数如下:

kernel_size = 2
stride = 2
padding = 0

6.使用5*5的卷积核进行卷积操作,得到通道数为64,高和宽为8的张量。可以推出该池化层的参数如下 :

in_channels = 32
out_channels = 64
kernel_size = 5
stride = 1
padding = 2

7.使用2*2的卷积核进行卷积操作,得到通道数为64,高和宽为4的张量。可以推出该池化层的参数如下  :

kernel_size = 2
stride = 2
padding = 0

8.将64*4*4的张量进行展平操作得到长为1024的向量

9.将长为1024的向量进行线性变换得到长为64的向量(隐藏层),可以推出该线性层的参数如下:

in_features:1024
out_features:64

10.将长为64的向量进行线性变换得到长为10的向量,可以推出该线性层的参数如下:

in_features:64
out_features:10

因此,模型代码如下:

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, 5, padding=2)
        self.max_pool1 = nn.MaxPool2d(2)
        self.conv2 = nn.Conv2d(32, 32, 5, padding=2)
        self.max_pool2 = nn.MaxPool2d(2)
        self.conv3 = nn.Conv2d(32, 64, 5, padding=2)
        self.max_pool3 = nn.MaxPool2d(2)
        self.flatten = nn.Flatten()
        self.linear1 = nn.Linear(1024, 64)
        self.linear2 = nn.Linear(64, 10)


# 必须覆盖该方法,该方法会在实例像函数一样调用时被调用,后面会有示例
    def forward(self, x):
        x = self.conv1(x)
        x = self.max_pool1(x)
        x = self.conv2(x)
        x = self.max_pool2(x)
        x = self.conv3(x)
        x = self.max_pool3(x)
        x = self.flatten(x)
        x = self.linear1(x)
        x = self.linear2(x)
        return x

sequential 

使用torch.nn.Sequential可以简化模型的搭建代码,他是一个顺序存放Module的容器。当sequential执行时,会按照Module在构造函数中的先后顺序依次调用,前面Module的输出会作为后面Module的输入。

使用sequential,上一节的代码可以简化为:

class MyModel(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.module = nn.Sequential(
          nn.Conv2d(3, 32, 5, 1, 2),
          nn.MaxPool2d(2),
          nn.Conv2d(32, 32, 5, 1, 2),
          nn.MaxPool2d(2),
          nn.Conv2d(32, 64, 5, 1, 2),
          nn.MaxPool2d(2),
          nn.Flatten(),
          nn.Linear(64*4*4, 64),
          nn.Linear(64, 10)
        )

    def forward(self, x):
        x =self.module(x)
        return x
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pytorch搭建网络模型的步骤如下: 1. 导入所需模块 ```python import torch import torch.nn as nn import torch.optim as optim ``` 2. 定义网络模型 定义网络模型时,需要继承`nn.Module`类,并在构造函数中定义网络的各个层次。下面是一个简单的示例: ```python class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x ``` 3. 定义损失函数和优化器 ```python criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) ``` 4. 训练网络模型 ```python for epoch in range(2): # loop over the dataset multiple times running_loss = 0.0 for i, data in enumerate(trainloader, 0): # get the inputs inputs, labels = data # zero the parameter gradients optimizer.zero_grad() # forward + backward + optimize outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # print statistics running_loss += loss.item() if i % 2000 == 1999: # print every 2000 mini-batches print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0 ``` 在训练过程中,需要循环迭代数据集,将输入数据传入网络,计算损失函数并进行反向传播,最后更新网络参数。 5. 测试网络模型 ```python correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: %d %%' % ( 100 * correct / total)) ``` 在测试过程中,需要使用测试数据集对训练好的网络模型进行验证,并计算模型的准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值