deep-learning - 如何使用动态输入创建用于图像分类的 CNN
问题描述
我想在 pytorch 中为二进制图像分类创建一个完全卷积网络,它可以采用动态输入图像大小,但我在概念上不太理解将最后一层从完全连接层更改为卷积层的想法。在这里和这里都声明这可以通过使用 1x1 卷积来实现。
假设我有一个 16x16x1 的图像作为 CNN 的输入。经过几次卷积后,输出为 16x16x32。如果使用全连接层,我可以通过创建 16*16*32 权重并将其馈送到单个神经元来产生单个值输出。我不明白的是如何通过应用 1x1 卷积获得单值输出。你最终不会得到 16x16x1 的输出吗?
解决方案
检查此链接:http ://cs231n.github.io/convolutional-networks/#convert
在这种情况下,您的卷积层应该是具有 1 个输出通道的 16 x 16 滤波器。这会将 16 x 16 x 32 输入转换为单个输出。
要测试的示例代码:
from keras.layers import Conv2D, Input
from keras.models import Model
import numpy as np
input = Input((16,16,32))
output = Conv2D(1, 16)(input)
model = Model(input, output)
print(model.summary()) # check the output shape
output = model.predict(np.zeros((1, 16, 16, 32))) # check on sample data
print(f'output is {np.squeeze(output)}')
这种完全卷积网络的方法在使用基于补丁的方法的分割任务中很有用,因为您可以通过提供更大部分的图像来加速预测(推理)。
对于分类任务,通常最后有一个 fc 层。在这种情况下,使用像 AdaptiveAvgPool2d 这样的层来确保 fc 层看到恒定的输入特征大小,而与输入图像大小无关。 https://pytorch.org/docs/stable/nn.html#adaptiveavgpool2d
请参阅 torchvision VGG 的拉取请求:https ://github.com/pytorch/vision/pull/747
如果是 Keras,则为 GlobalAveragePooling2D。请参阅示例“在一组新类上微调 InceptionV3”。 https://keras.io/applications/
推荐阅读
- android - 需要将 recyclerview 单击的项目 id 传递给第二个 recyclerview
- symfony - Symfony 4 - 供应商捆绑包找不到标记的自动接线服务
- nginx - NGINX:在 access_log 中混淆密码
- shell - 需要 cronjob 来备份、压缩和开发空文件
- java - 设计文档 api java
- .net-core - 无法在 Rider 中禁用某些 stylecop 规则
- php - 动态外键的数据库关系
- windows - 使用 WiX 在安装时启动外部服务
- swift - 尝试将 UIElement 作为函数中的参数传递
- c# - 哪个带有 SocketOptionName.ReuseAddress 的 UdpClient 实际接受数据?