如何使用 Pytorch 实现将 Alexnet 中的附加输入数据与最后一个 dropout 层的输出连接起来?

Posted

技术标签:

【中文标题】如何使用 Pytorch 实现将 Alexnet 中的附加输入数据与最后一个 dropout 层的输出连接起来?【英文标题】:How can I concatenate an additional input data in Alexnet with the output of the last dropout layer using Pytorch implementation? 【发布时间】:2021-11-09 20:44:45 【问题描述】:

这是实现架构

class AlexNet(nn.Module):
def __init__(self, num_classes=10):
    super(AlexNet, self).__init__()
    #1
    self.features= nn.Sequential(
    nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=0),
    nn.ReLU(inplace=True),
    nn.MaxPool2d(kernel_size=3, stride=2),
    #2
    nn.Conv2d(96, 256, kernel_size=5, stride=1, padding=2),
    nn.ReLU(inplace=True),
    nn.MaxPool2d(kernel_size=3, stride=2),
    #3
    nn.Conv2d(256, 384, kernel_size=3, stride=1, padding=1),
    nn.ReLU(inplace=True),
    #4
    nn.Conv2d(384, 384, kernel_size=3, stride=1, padding=1),
    nn.ReLU(inplace=True),
    #5
    nn.Conv2d(384, 256, kernel_size=5, stride=1, padding=2),
    nn.ReLU(inplace=True),
    nn.MaxPool2d(kernel_size=3, stride=2),
    )
    self.avgpool= nn.AvgPool2d(6)
    self.classifier= nn.Sequential(
        nn.Dropout(), nn.Linear(256*6*6, 4096), #128*2*2, 1024
    nn.ReLU(inplace=True), nn.Dropout(),torch.cat((nn.Dropout(),PIs_features)),
    nn.Linear(4096, num_classes))
    
def forward(self, x):
    x= self.features(x)
    x=x.view(x.size(0), 256*6*6)
    x= self.classifier(x)
    return x

所以我想用 self.classifier 中最后一个 dropout 层 'nn.dropout()' 的输出来实现 say 'y' 输入数据。

提前致谢。

【问题讨论】:

【参考方案1】:

您可以在forward 定义中这样做,只需调用torch.cat((x, y), 1) 将两个特征向量连接在一起。

class AlexNet(nn.Module):
  def __init__(self, num_classes=10):
      super().__init__()
        #1
      self.features= nn.Sequential(
        nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=0),
        nn.ReLU(inplace=True),
        nn.MaxPool2d(kernel_size=3, stride=2),
        #2
        nn.Conv2d(96, 256, kernel_size=5, stride=1, padding=2),
        nn.ReLU(inplace=True),
        nn.MaxPool2d(kernel_size=3, stride=2),
        #3
        nn.Conv2d(256, 384, kernel_size=3, stride=1, padding=1),
        nn.ReLU(inplace=True),
        #4
        nn.Conv2d(384, 384, kernel_size=3, stride=1, padding=1),
        nn.ReLU(inplace=True),
        #5
        nn.Conv2d(384, 256, kernel_size=5, stride=1, padding=2),
        nn.ReLU(inplace=True),
        nn.MaxPool2d(kernel_size=3, stride=2))
      
      self.avgpool= nn.AvgPool2d(6)
      self.classifier= nn.Sequential(
          nn.Dropout(), 
          nn.LazyLinear(4096),
          nn.ReLU(inplace=True), 
          nn.Dropout())
      
      self.fc = nn.LazyLinear(num_classes)
      
  def forward(self, x, y):
      x = self.features(x)
      x = self.avgpool(x)
      x = x.flatten(1)
      x = torch.cat((x, y), 1)
      x = self.classifier(x)
      return x

此外,我已经用LazyLayer 替换了完全连接的nn.Linear 层。但是如果你愿意,你可以用固定的神经元来代替它们。

【讨论】:

首先,感谢您抽出宝贵时间回复我。其次,我的输入数据'y'是一个ndarray。事实上,它是一个 (50000,512) ndarray。所以我的问题是;即使使用 ndarray,torch.cat() 也会完成这项工作吗? 这个数组对应什么?您是否像输入数据x 一样对其进行了批处理? 这是一个ndarray的浮点数,实际上是经过一系列层后的Cifar10数据集。 <tf.Tensor: shape=(50000, 512), dtype=float32, numpy= array([[0.16850434, 0. , 0. , ..., 0.00404162, 0. , 0.4163648 ], [0.0022806 , 0. , 0. , ..., 0. , 0. , 0.23594026], [0.10330583, 0. , 0. , ..., 0. , 0. , 0.05631779], ..., [0.2042241 , 0. , 0. , ..., 0. , 0. , 0.21623006]], dtype=float32)> 而我的输入数据 x 是 Cifar10 数据集的 50000 个样本 train_images

以上是关于如何使用 Pytorch 实现将 Alexnet 中的附加输入数据与最后一个 dropout 层的输出连接起来?的主要内容,如果未能解决你的问题,请参考以下文章

AlexNet-pytorch实现

AlexNet-pytorch实现

AlexNet-pytorch实现

pytorch Alexnet 网络模型搭建

AlexNet--CNN经典网络模型详解(pytorch实现)

3.2使用PyTorch搭建AlexNet并训练花分类数据集