首页 > 解决方案 > CNN forward 函数,AutoTuning 层数

问题描述

class ConvolutionalNetwork(nn.Module):
    def __init__(self, in_features, trial):
        # we optimize the number of layers, hidden units and dropout ratio in each layer.
        n_layers = self.trial.suggest_int("n_layers", 1, 5)
        p = self.trial.suggest_uniform("dropout_1{}".format(i), 0, 1.0)
        layers = []
        for i in range(n_layers):
            self.out_features = self.trial.suggest_int("n_units_1{}".format(i), 16, 160,step =2)
            kernel_size = trial.suggest_int('kernel_size', 2, 7)
            layers.append(nn.Conv1d(1, self.out_features,kernel_size,1))
            layers.append(nn.RReLU())
            layers.append(nn.BatchNorm1d(self.out_features)
            layers.append(nn.Dropout(p))

            self.in_features = self.out_features

        layers.append(nn.Conv1d(self.in_features, 16,kernel_size,1))
        layers.append(nn.RReLU())
        return nn.Sequential(*layers)

正如您在上面看到的,我对参数进行了一些 Optuna 调整,包括调整层数。

def forward(self,x):
    # shape x for conv 1d op
    x = x.view(-1, 1, self.in_features)
    x = self.conv1(x)
    x = F.rrelu(x)
    x = F.max_pool1d(x, 64, 64)
    x = self.conv2(x)
    x = F.rrelu(x)
    x = F.max_pool1d(x, 64, 64)
    x = x.view(-1, self.n_conv)

    x = self.dp(x)
    x = self.fc3(x)
    x = F.log_softmax(x, dim=1)
    return x

我现在需要对上面的 forward 函数做同样的事情,我做了下面的伪代码,但它不会运行,请告知如何。主要问题是将 for 循环函数合并到 forward 函数中。

def forward(self,x):
    # shape x for conv 1d op
    x = x.view(-1, 1, self.in_features)
    for i in range(n_layers):
        layers.append(self.conv1(x))
        layers.append(F.rrelu(x))
        layers.append(F.max_pool1d(x, 64, 64))
    x = x.view(-1, self.n_conv)
    x = self.dp(x)
    x = self.fc3(x)
    #x = F.sigmoid(x)
    x = F.log_softmax(x, dim=1)
    return x

标签: pytorchconv-neural-networkoptunaauto-tuning

解决方案


有一堆错误使您难以理解您打算做什么:

  • 你为什么要在 中建立一个nn.Sequential模型__init__而不使用它?
  • 这个return指令是什么__init__??
  • 您创建的连续卷积层没有匹配的通道大小(in_channels始终为 1)。一次迭代的out_feature应该是in_features下一次迭代的
  • 您的函数伪代码forward将张量附加到layers列表中(顺便说一句,您没有声明),然后不使用该列表。
  • 在 开始时forward,您使用 重塑输入x = x.view(-1, 1, self.in_features),但此时in_features与第一个卷积层的输入通道数完全不匹配。

长话短说:纠正以上所有错误,然后是:

class ConvolutionalNetwork(nn.Module):
    def __init__(self, in_features, trial):
        # do your stuff here ...
        self._model = nn.Sequential(*layers)
    def forward(self, x):
        return self._model(x)

应该管用


推荐阅读