我正在尝试修改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'
如何修改提供的代码部分?
答案 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)
)