【问题标题】:How do I pass a color image through a Pytorch convolutional layer with custom filter?如何使用自定义过滤器通过 Pytorch 卷积层传递彩色图像?
【发布时间】:2020-04-22 20:24:46
【问题描述】:

我试图想象当 color 图像通过卷积层时会发生什么。为此,我使用零和一设置自定义权重。 我面临的问题是我丢失了 3D 通道,并在将数据通过图层后获得了 1D 通道。

import requests
from io import BytesIO
from PIL import Image
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as np

link = 'https://audimediacenter-a.akamaihd.net/system/production/media/85094/images' \
       '/2a4e98976b1f9088fe6ae883f2f29e4d8f3ed473/A1912967_x500.jpg?1575885688'

r = requests.get(link, timeout=10)
im = Image.open(BytesIO(r.content))

pic = np.array(im)

horizontal_filter = torch.zeros(5, 5)
horizontal_filter[2, :] = 1

print(horizontal_filter)

这是我的自定义过滤器:

tensor([[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.],
        [1., 1., 1., 1., 1.],
        [0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]])

现在我正在使用自定义过滤器并重复它以适应 3 个通道。

hz = nn.Conv2d(in_channels=3,
               out_channels=3,
               kernel_size=5,
               stride=1,
               bias=None)

hz.weight.data =  horizontal_filter.type('torch.FloatTensor').repeat(1, 3, 1, 1)

print(hz.weight.data.shape)

这是过滤器的形状:

torch.Size([1, 3, 5, 5])

我通过卷积过滤器,我失去了 3 个通道:

zz = hz(torch.tensor(pic[None, ...]).permute(0, 3, 1, 2).type('torch.FloatTensor'))

print(np.transpose(zz.detach().numpy(), (0, 2, 3, 1)).shape)
(1, 329, 496, 1)

如果我绘制它,我就没有颜色了。

z = np.transpose(zz.detach().numpy(), (0, 2, 3, 1))[0, :, :, 0]

f, axarr = plt.subplots()
axarr.imshow(z)
plt.show()

tl;dr:如何通过卷积层传递 3D 图片并返回具有 3 个通道的图像?

【问题讨论】:

    标签: python conv-neural-network pytorch rgb


    【解决方案1】:

    输出通道的数量等于过滤器的数量,每个过滤器的深度(内核数量)应该与输入图像的深度相匹配。 作为示例,请参见下图(来源:cs231n)。我们有一个形状为 7x7 的输入图像,具有 3 个通道和 2 个形状为 3x3x3 的滤波器 W0 和 W1。第 i 个输入通道与滤波器 W0 (W1) 的第 i 个内核进行卷积,然后将它们相加得到输出的第一个(第二个)通道。

    在您的示例中,您只有一个带有三个 5x5 内核 (1x3x5x5) 的过滤器,因此输出只有一个通道。要获得 3 个通道的输出,您需要三个这样的过滤器,即一个形状数组 (3x3x5x5)。

    【讨论】:

      【解决方案2】:

      问题在于您没有足够地重复频道。由于您有 3 个输入和输出通道,因此 Conv 权重矩阵将为 3x3x5x5。因为你设置为1x3x5x5,所以只能输出1个通道。

      您需要进行以下更改

      hz.weight.data =  horizontal_filter.type('torch.FloatTensor').repeat(3, 3, 1, 1)
      
      

      由于您的过滤器,您的输出的最大值约为 3700。所以要查看,使用z = z/np.max(z)除以最大值,然后你得到

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-25
        • 2018-11-27
        • 2013-05-25
        • 2013-11-22
        • 2019-11-28
        • 1970-01-01
        • 2022-11-13
        相关资源
        最近更新 更多