首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pytorch:修改VGG16体系结构

Pytorch:修改VGG16体系结构
EN

Stack Overflow用户
提问于 2018-11-02 08:15:10
回答 2查看 3K关注 0票数 1

我目前正在尝试修改VGG16网络架构,以便它能够接受400x400PX映像。

根据我读过的文献,这样做的方法是将完全连接(FC)层转换成卷积(CONV)层。这将从本质上“允许网络在更大的输入图像上有效地”滑动“,并对图像的不同部分进行多个评估,包括所有可用的上下文信息。”然后,使用平均池层“将多个特征向量平均为单个特征向量,该特征向量概括输入图像”。

我已经完成了这个使用此函数,并提出了以下网络体系结构:

代码语言:javascript
复制
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 400, 400]           1,792
              ReLU-2         [-1, 64, 400, 400]               0
            Conv2d-3         [-1, 64, 400, 400]          36,928
              ReLU-4         [-1, 64, 400, 400]               0
         MaxPool2d-5         [-1, 64, 200, 200]               0
            Conv2d-6        [-1, 128, 200, 200]          73,856
              ReLU-7        [-1, 128, 200, 200]               0
            Conv2d-8        [-1, 128, 200, 200]         147,584
              ReLU-9        [-1, 128, 200, 200]               0
        MaxPool2d-10        [-1, 128, 100, 100]               0
           Conv2d-11        [-1, 256, 100, 100]         295,168
             ReLU-12        [-1, 256, 100, 100]               0
           Conv2d-13        [-1, 256, 100, 100]         590,080
             ReLU-14        [-1, 256, 100, 100]               0
           Conv2d-15        [-1, 256, 100, 100]         590,080
             ReLU-16        [-1, 256, 100, 100]               0
        MaxPool2d-17          [-1, 256, 50, 50]               0
           Conv2d-18          [-1, 512, 50, 50]       1,180,160
             ReLU-19          [-1, 512, 50, 50]               0
           Conv2d-20          [-1, 512, 50, 50]       2,359,808
             ReLU-21          [-1, 512, 50, 50]               0
           Conv2d-22          [-1, 512, 50, 50]       2,359,808
             ReLU-23          [-1, 512, 50, 50]               0
        MaxPool2d-24          [-1, 512, 25, 25]               0
           Conv2d-25          [-1, 512, 25, 25]       2,359,808
             ReLU-26          [-1, 512, 25, 25]               0
           Conv2d-27          [-1, 512, 25, 25]       2,359,808
             ReLU-28          [-1, 512, 25, 25]               0
           Conv2d-29          [-1, 512, 25, 25]       2,359,808
             ReLU-30          [-1, 512, 25, 25]               0
        MaxPool2d-31          [-1, 512, 12, 12]               0
           Conv2d-32           [-1, 4096, 1, 1]     301,993,984
             ReLU-33           [-1, 4096, 1, 1]               0
          Dropout-34           [-1, 4096, 1, 1]               0
           Conv2d-35           [-1, 4096, 1, 1]      16,781,312
             ReLU-36           [-1, 4096, 1, 1]               0
          Dropout-37           [-1, 4096, 1, 1]               0
           Conv2d-38              [-1, 3, 1, 1]          12,291
AdaptiveAvgPool2d-39              [-1, 3, 1, 1]               0
          Softmax-40              [-1, 3, 1, 1]               0
================================================================
Total params: 333,502,275
Trainable params: 318,787,587
Non-trainable params: 14,714,688
----------------------------------------------------------------
Input size (MB): 1.83
Forward/backward pass size (MB): 696.55
Params size (MB): 1272.21
Estimated Total Size (MB): 1970.59
----------------------------------------------------------------

我的问题很简单:是否有必要在最后使用平均池层?从最后的卷积层看,我们得到了一幅1x1的3通道图像。对此进行平均池操作似乎没有任何效果。

如果我的逻辑/架构有什么问题,请随时指出。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-06 12:25:37

如何将VGG转换为400 x 400的输入大小?

优先逼近

VGG风格架构的问题是,我们正在硬编码线性层中的输入和输出特性的数量。i.e

代码语言:javascript
复制
vgg.classifier[0]: Linear(in_features=25088, out_features=4096, bias=True)

它期望有25,088个输入功能。

如果我们通过(3, 224, 224)传递一个大小为vgg.features的图像,输出特征映射将是维数:

代码语言:javascript
复制
(512, 7, 7) => 512 * 7 * 7 => 25,088

如果我们将输入图像大小更改为(3, 400, 400)并通过vgg.features,输出特征映射将是维数:

代码语言:javascript
复制
(512, 12, 12) => 512 * 12 * 12 =>  73,728

throws `sizemismatch` error.

解决此问题的一种方法是使用nn.AdaptiveAvgPool代替nn.AvgPool。AdaptiveAvgPool帮助定义层的输出大小,无论通过vgg.features层输入的大小如何,该层都保持不变。

例如:

代码语言:javascript
复制
vgg.features[30] = nn.AdaptiveAvgPool(output_size=(7,7))

will make sure the final feature maps have a dimension of `(512, 7, 7)` 
irrespective of the input size.

您可以在这里中阅读有关自适应池的更多信息。

第二次逼近

如果您使用这里技术将线性层转换为卷积层,则不必担心输入维度,但是由于参数数量的变化,您必须更改权重初始化技术。

是否有必要在最后使用平均池层?

不,在这种情况下。它不会改变输入功能映射的大小,因此它不会对一组节点进行平均操作。

票数 3
EN

Stack Overflow用户

发布于 2018-11-03 18:00:32

AdaptiveAvgPool2d的目的是使convnet能够处理任意大小的输入(并产生固定大小的输出)。在您的情况下,由于输入大小固定为400x400,所以您可能不需要它。

我认为这篇论文可能会给你一个更好的方法- https://arxiv.org/pdf/1406.4729v3.pdf

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53114882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档