首页 > 解决方案 > 如何使用动态输入创建用于图像分类的 CNN

问题描述

我想在 pytorch 中为二进制图像分类创建一个完全卷积网络,它可以采用动态输入图像大小,但我在概念上不太理解将最后一层从完全连接层更改为卷积层的想法。在这里这里都声明这可以通过使用 1x1 卷积来实现。

假设我有一个 16x16x1 的图像作为 CNN 的输入。经过几次卷积后,输出为 16x16x32。如果使用全连接层,我可以通过创建 16*16*32 权重并将其馈送到单个神经元来产生单个值输出。我不明白的是如何通过应用 1x1 卷积获得单值输出。你最终不会得到 16x16x1 的输出吗?

标签: deep-learningconv-neural-network

解决方案


检查此链接: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/


推荐阅读