【PyTorch】什么时候使用数组形式创建多个卷积层
  TEZNKK3IfmPf 2023年11月15日 31 0

问题

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

= []
        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))

网络输出结果:

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

结语

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年04月19日   18   0   0 python
  I7JaHrFMuDsU   24天前   21   0   0 pytorch
  TEZNKK3IfmPf   2024年04月19日   25   0   0 idepython
TEZNKK3IfmPf