实现指定深度的卷积块的正确方法是什么?

xiaoxingxing pytorch 209

原文标题What’s the correct way to implement convolutional blocks of specified depth?

我正在尝试在 PyTorch 中使用卷积神经网络实现贝叶斯优化,具体来说,我正在尝试将网络结构从 Matlab BayesOptExperiment 转换为 PyTorch。我希望我的网络具有以下结构:

输入数据 ->convblock-> maxpool ->convblock-> maxpool ->convblock-> avgpool -> flatten -> linear -> softmax

其中convblock包括:

[conv2Dlayer -> 批量归一化层 -> ReLU],

重复了几次。当前版本仅在section_depth = 1达到 65-70% 左右的准确度时才能按预期工作,尽管如果我将 convblock 的深度提高到 10% 左右。我肯定错过了一些东西,但我不确定那是什么。我的网络结构:

import torch
import numpy as np
import torch.nn as nn
import torch.nn.functional as F

#...

class Net(nn.Module):
    def __init__(self, section_depth):
        super().__init__()
        #! define network architecture
        self.section_depth = section_depth
        self.num_filters = round(16/np.sqrt(self.section_depth))
        self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.avgpool = nn.AvgPool2d(kernel_size=8)
        self.block1 = nn.ModuleList()
        self.block2 = nn.ModuleList()
        self.block3 = nn.ModuleList()
        self.batchnorm1 = nn.BatchNorm2d(self.num_filters)
        self.batchnorm2 = nn.BatchNorm2d(2*self.num_filters)
        self.batchnorm3 = nn.BatchNorm2d(4*self.num_filters)
        for i in range(self.section_depth):
            channels1 = 3 if i==0 else self.num_filters
            channels2 = self.num_filters if i == 0 else 2*self.num_filters
            channels3 = 2*self.num_filters if i == 0 else 4*self.num_filters
            self.block1.append(nn.Conv2d(in_channels=channels1, out_channels=self.num_filters, kernel_size=3, padding='same'))
            self.block2.append(nn.Conv2d(in_channels=channels2, out_channels=2*self.num_filters, kernel_size=3, padding='same'))
            self.block3.append(nn.Conv2d(in_channels=channels3, out_channels=4*self.num_filters, kernel_size=3, padding='same'))
        self.fc1 = nn.Linear(4*self.num_filters, 10)  # ? number of outputs
        self.softmax = nn.Softmax(dim=1)

    def forward(self, x):
        for i in self.block1:
            x = F.relu(self.batchnorm1(i(x)))
        x = self.maxpool(x)
        for i in self.block2:
            x = F.relu(self.batchnorm2(i(x)))
        x = self.maxpool(x)
        for i in self.block3:
            x = F.relu(self.batchnorm3(i(x)))
        x = self.avgpool(x)
        x = torch.flatten(x, 1) # flatten all dimensions except batch
        x = self.fc1(x)
        x = self.softmax(x)
        return x

任何帮助,将不胜感激。

原文链接:https://stackoverflow.com//questions/71416364/whats-the-correct-way-to-implement-convolutional-blocks-of-specified-depth

回复

我来回复
  • Krolik1337的头像
    Krolik1337 评论

    好的,我想通了。事实证明,批量归一化层具有可学习的参数,因此我不得不为每个卷积层创建一个单独的批量规范层,而不是对整个卷积块使用相同的层。

    2年前 0条评论