在PyTorch中修改预训练的模型

时间:2020-06-26 20:22:41

标签: pytorch

我正在尝试修改mobilenetv2模型中的这段特定代码

(17): InvertedResidual(
      (conv): Sequential(
        (0): ConvBNReLU(
          (0): Conv2d(160, 960, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(960, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): ReLU6(inplace=True)
        )

在conv2d部分之后,我想添加一个max-pooling层,但是我很难确定这样做的地方。我怀疑这将类似于执行以下操作:

MobileNet.features = nn.Sequential(nn.Linear(1280, 1000), nn.LeakyReLU(), nn.Dropout(0.5), nn.Linear(1000,3), nn.LogSoftmax(dim=1))

我会在哪里做类似的事情

MobileNet.features[17].conv[0] = nn.ConvBRELU(nn.Conv2d(),nn.maxpool,nn.BatchNorm(),nn.ReLU())

但是当我尝试得到错误消息时模块'torch.nn'没有属性'ConvBNReLU'

如何修改提供的代码部分?

1 个答案:

答案 0 :(得分:0)

ConvBNReLU不是nn模块-您可以找到所有可用的nn模块here

它在torchvision中定义。您需要通过

导入
from torchvision.models.mobilenet import ConvBNReLU

虽然不能仅在ConvBNReLU中插入最大池,但它是从nn.Sequential继承而来的,有助于指定参数。我建议您创建一个新类,从ConvBNReLU复制代码,然后在其中插入一个最大池。

class ConvMaxPoolBNReLU(nn.Sequential):
    def __init__(self, in_planes, out_planes, kernel_size=3, stride=1, groups=1, norm_layer=None):
        padding = (kernel_size - 1) // 2
        if norm_layer is None:
            norm_layer = nn.BatchNorm2d
        super(ConvBNReLU, self).__init__(
            nn.Conv2d(in_planes, out_planes, kernel_size, stride, padding, groups=groups, bias=False),
            nn.MaxPool2d(2),
            norm_layer(out_planes),
            nn.ReLU6(inplace=True)
        )