Computer vision Pytorch:修改VGG16体系结构
我目前正在尝试修改VGG16网络体系结构,以便它能够接受400x400像素的图像 根据我所阅读的文献,实现这一点的方法是将完全连接的FC层转换为卷积CONV层。这将基本上允许网络在更大的输入图像上有效地“滑动”,并对图像的不同部分进行多个评估,包括所有可用的上下文信息。然后,使用平均池层将多个特征向量平均为单个特征向量,以汇总输入图像 我已经完成了这项工作,并提出了以下网络架构:Computer vision Pytorch:修改VGG16体系结构,computer-vision,conv-neural-network,pytorch,vgg-net,Computer Vision,Conv Neural Network,Pytorch,Vgg Net,我目前正在尝试修改VGG16网络体系结构,以便它能够接受400x400像素的图像 根据我所阅读的文献,实现这一点的方法是将完全连接的FC层转换为卷积CONV层。这将基本上允许网络在更大的输入图像上有效地“滑动”,并对图像的不同部分进行多个评估,包括所有可用的上下文信息。然后,使用平均池层将多个特征向量平均为单个特征向量,以汇总输入图像 我已经完成了这项工作,并提出了以下网络架构: ----------------------------------------------------------
----------------------------------------------------------------
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
----------------------------------------------------------------
我的问题很简单:是否需要在最后使用平均池层?似乎在最后一个卷积层,我们得到了一个具有3个通道的1x1图像。在这上面做一个平均池似乎没有任何效果
如果我的逻辑/架构有任何错误,请随时指出。
谢谢 AdaptiveAvgPool2d的目的是使convnet能够处理任意大小的输入,并生成固定大小的输出。在您的情况下,由于输入大小固定为400x400,您可能不需要它
我认为本文可能会让您更好地了解这种方法-AdaptiveAvgPool2d的目的是使convnet在任意大小的输入上工作,并生成固定大小的输出。在您的情况下,由于输入大小固定为400x400,您可能不需要它
我认为这篇论文可能会让你更好地了解这种方法-
如何将VGG转换为400 x 400的输入大小
第一种方法
VGG风格架构的问题在于,我们正在对线性层中输入和输出特性的数量进行硬编码。
i、 e
预计将有25088个输入功能
如果我们通过一个大小为3,224,224的图像
通过vgg.features,输出特征图的尺寸为:
(512, 7, 7) => 512 * 7 * 7 => 25,088
(512, 12, 12) => 512 * 12 * 12 => 73,728
throws `sizemismatch` error.
如果我们将输入图像大小更改为3400400并通过
通过vgg.features,输出特征图的尺寸为:
(512, 7, 7) => 512 * 7 * 7 => 25,088
(512, 12, 12) => 512 * 12 * 12 => 73,728
throws `sizemismatch` error.
解决此问题的一种方法是使用nn.AdaptiveAvgPool代替nn.AvgPool。AdaptiveAvgPool有助于定义该层的输出大小,无论通过vgg.features层输入的大小如何,该输出大小都保持不变
例如:
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.
您可以在中阅读有关自适应池的更多信息
第二种方法
如果使用该技术将线性层转换为卷积层,则不必担心输入维度,但由于参数数量的变化,必须更改权重初始化技术
最终是否需要使用平均池层
不,在这种情况下。它不会改变输入特征映射的大小,因此不会对一组节点进行平均
如何将VGG转换为400 x 400的输入大小
第一种方法
VGG风格架构的问题在于,我们正在对线性层中输入和输出特性的数量进行硬编码。
i、 e
预计将有25088个输入功能
如果我们通过一个大小为3,224,224的图像
通过vgg.features,输出特征图的尺寸为:
(512, 7, 7) => 512 * 7 * 7 => 25,088
(512, 12, 12) => 512 * 12 * 12 => 73,728
throws `sizemismatch` error.
如果我们将输入图像大小更改为3400400并通过
通过vgg.features,输出特征图的尺寸为:
(512, 7, 7) => 512 * 7 * 7 => 25,088
(512, 12, 12) => 512 * 12 * 12 => 73,728
throws `sizemismatch` error.
解决此问题的一种方法是使用nn.AdaptiveAvgPool代替nn.AvgPool。AdaptiveAvgPool有助于定义该层的输出大小,无论通过vgg.features层输入的大小如何,该输出大小都保持不变
例如:
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.
您可以在中阅读有关自适应池的更多信息
第二种方法
如果使用该技术将线性层转换为卷积层,则不必担心输入维度,但由于参数数量的变化,必须更改权重初始化技术
最终是否需要使用平均池层
不,在这种情况下。它不会改变输入特征映射的大小,因此不会对一组节点进行平均 自适应池的一个缺点是,在尝试执行特定于硬件的图形优化时,通常不支持此层类型自适应池的一个缺点是,在尝试执行特定于硬件的图形优化时,通常不支持此层类型