【PyTorch】什么时候使用数组形式创建多个卷积层

简介: 【PyTorch】什么时候使用数组形式创建多个卷积层

问题

PyTorch实现CNN卷积网络的时候,使用数组的方式创建层是一种十分常见的方式,如下所示:

        classifier = []
        classifier.append(nn.Linear(64, 512)) # in_cha
        classifier.append(nn.Linear(512, 2))
        self.classifier = nn.Sequential(*classifier)

然而,什么情况下应该使用这种方式呢?

方法

本文将通过案例详细阐述。

方法1

import torch
from torch import nn
class Net(nn.Module):
    def __init__(self) -> None:
        super().__init__()
        # 这种情况下,使用数组来构建层毫无意义
        layers = []
        layers.append(nn.Conv2d(3, 32, 3, padding=1))
        layers.append(nn.AdaptiveAvgPool2d(1))
        layers.append(nn.Flatten())
        layers.append(nn.Linear(32, 2))
        self.classifier = nn.Sequential(*layers)
    def forward(self, x):
        return self.classifier(x)
if __name__ == '__main__':
    x = torch.rand(size=(1, 3, 224, 224))
    net = Net()
    print(net(x).shape)

方法2

import torch
from torch import nn
class Net(nn.Module):
    def __init__(self) -> None:
        super().__init__()
        self.classifier = nn.Sequential(
            nn.Conv2d(3, 32, 3, padding=1),
            nn.AdaptiveAvgPool2d(1),
            nn.Flatten(),
            nn.Linear(32, 2)
        )
    def forward(self, x):
        return self.classifier(x)
if __name__ == '__main__':
    x = torch.rand(size=(1, 3, 224, 224))
    net = Net()
    print(net(x).shape)

方法3

方法1和方法2相比,没有使用数组的方法2更加简洁、清晰。

假如构建10个卷积层,卷积层的输入通道数每次增加5个,应该如何实现呢

import torch
from torch import nn
class Net(nn.Module):
    def __init__(self) -> None:
        super().__init__()
        in_channels = 3
        grow = 5
        layers = []
        for i in range(10):
            # 每次增加grow个通道,并保持特征图大小不改变
            layers.append(nn.Conv2d(in_channels, in_channels+grow, 3, padding=1))
            in_channels += grow
        self.block = nn.Sequential(*layers)
        self.classifier = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Flatten(),
            nn.Linear(in_channels, 2)
        )
    def forward(self, x):
        x = self.block(x)
        return self.classifier(x)
if __name__ == '__main__':
    from torchsummary import summary
    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    x = torch.rand(size=(1, 3, 224, 224)).to(device)
    net = Net().to(device)
    print(net(x).shape)
    summary(net, (3, 224, 224))


网络输出结果:

结语

当网络层的输入通道数呈现某种规律性的变化时,使用数组创建层的方式将会变得简单,而通常情况下,则无需使用数组,使用Sequential的方式创建会使代码变得更加清晰、易懂。

目录
相关文章
|
7月前
|
机器学习/深度学习 编解码 PyTorch
Pytorch实现手写数字识别 | MNIST数据集(CNN卷积神经网络)
Pytorch实现手写数字识别 | MNIST数据集(CNN卷积神经网络)
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch应用实战一:实现卷积操作
PyTorch应用实战一:实现卷积操作
180 0
|
6月前
|
机器学习/深度学习 算法 PyTorch
【从零开始学习深度学习】50.Pytorch_NLP项目实战:卷积神经网络textCNN在文本情感分类的运用
【从零开始学习深度学习】50.Pytorch_NLP项目实战:卷积神经网络textCNN在文本情感分类的运用
|
数据采集 机器学习/深度学习 PyTorch
Pytorch学习笔记(5):torch.nn---网络层介绍(卷积层、池化层、线性层、激活函数层)
Pytorch学习笔记(5):torch.nn---网络层介绍(卷积层、池化层、线性层、激活函数层)
865 0
Pytorch学习笔记(5):torch.nn---网络层介绍(卷积层、池化层、线性层、激活函数层)
|
7月前
|
机器学习/深度学习 算法 PyTorch
【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别
【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别
604 2
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch: nn网络层-卷积层
PyTorch: nn网络层-卷积层
105 0
|
7月前
|
机器学习/深度学习 存储 PyTorch
使用pytorch构建图卷积网络预测化学分子性质
在本文中,我们将通过化学的视角探索图卷积网络,我们将尝试将网络的特征与自然科学中的传统模型进行比较,并思考为什么它的工作效果要比传统的方法好。
81 0
|
7月前
|
机器学习/深度学习 数据采集 PyTorch
PyTorch搭建卷积神经网络(ResNet-50网络)进行图像分类实战(附源码和数据集)
PyTorch搭建卷积神经网络(ResNet-50网络)进行图像分类实战(附源码和数据集)
309 1
|
7月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch深度学习中卷积神经网络(CNN)的讲解及图像处理实战(超详细 附源码)
PyTorch深度学习中卷积神经网络(CNN)的讲解及图像处理实战(超详细 附源码)
326 0

热门文章

最新文章