【问题标题】:CNN for variable sized images in pytorchCNN 用于 pytorch 中的可变大小图像
【发布时间】:2021-04-26 22:16:01
【问题描述】:

我想在 pytorch 中制作一个 CNN 模型,它可以输入不同大小的图像。我正在尝试使用 2d 卷积层,它采用 4D 输入形状(pytorch 的 Conv2d 期望其 2D 输入实际上具有 4 个维度)。 但是,我不确定如何设置可以将所有可变大小的图像调整为固定数量的特征图以传递给剩余层的输入层。 例如,彩色图像的输入形状是 [4, 3, 32, 32],它对应于批量大小、通道数(RGB)、宽度和高度。如果图像是灰度的,那么它将具有 [4, 1, 32, 32],当形状不是图层预期的形状时会产生错误。

错误消息是“RuntimeError: Given groups=1, weight of size [6, 3, 5, 5], expected input[4, 1, 32, 32] 有 3 个通道,但有 1 个通道”

我目前的 CNN 架构如下。

def __init__(self, num_out, kernel_size, num_input_filters):
        super().__init__()
        self.num_input_filters = num_input_filters
        self.num_out = num_out
        self.kernel_size = kernel_size
        
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)


def forward(self, inp):
        inp = self.pool(F.relu(self.conv1(inp)))
        return inp

我参考了类似的问题,完全卷积网络 (FCN) 对输入大小完全没有限制,这可能是解决方案。而pytorch为FCN提供了ConvTranspose2d(),但它的参数似乎仍然需要固定的输入大小。 有什么方法可以解决这个问题吗?

【问题讨论】:

    标签: python pytorch conv-neural-network


    【解决方案1】:

    您可以通过将单个通道复制为三个来将灰度图像转换为 RGB。

    作为您的示例,形状[1, 32, 32] 可以通过以下代码转换为[3, 32, 32]:

    np.concatenate((images,)*3)
    

    如果形状是[32, 32, 1],试试

    np.concatenate((images,)*3, axis=-1)
    

    如果形状是[32, 32],那么你可以试试下面的代码转换成[32, 32, 3]:

    img_shape = tuple(np.ones(len(images.shape), dtype=int))
    img_shape += (3,)
    images = np.tile(np.expand_dims(images, axis=-1), img_shape)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 2019-12-06
      • 2022-11-22
      • 2013-01-14
      • 1970-01-01
      相关资源
      最近更新 更多