将卷积运算应用于图像 - PyTorch

blu*_*sky 4 python pytorch

要渲染形状为 27x35 的图像,我使用:

random_image = []
for x in range(1 , 946):
        random_image.append(random.randint(0 , 255))

random_image_arr = np.array(random_image)
matplotlib.pyplot.imshow(random_image_arr.reshape(27 , 35))
Run Code Online (Sandbox Code Playgroud)

这会生成:

在此输入图像描述

然后我尝试使用以下方法对图像应用卷积torch.nn.Conv2d

conv2 = torch.nn.Conv2d(3, 18, kernel_size=3, stride=1, padding=1)

image_d = np.asarray(random_image_arr.reshape(27 , 35))

conv2(torch.from_numpy(image_d))
Run Code Online (Sandbox Code Playgroud)

但这显示错误:

~/.local/lib/python3.6/site-packages/torch/nn/modules/conv.py in forward(self, input)
    299     def forward(self, input):
    300         return F.conv2d(input, self.weight, self.bias, self.stride,
--> 301                         self.padding, self.dilation, self.groups)
    302 
    303 

RuntimeError: input has less dimensions than expected
Run Code Online (Sandbox Code Playgroud)

输入的形状image_d(27, 35)

我应该更改 的参数Conv2d以便将卷积应用于图像吗?

更新。从@McLawrence 的回答我有:

random_image = []
for x in range(1 , 946):
        random_image.append(random.randint(0 , 255))

random_image_arr = np.array(random_image)
matplotlib.pyplot.imshow(random_image_arr.reshape(27 , 35))
Run Code Online (Sandbox Code Playgroud)

这渲染图像:

在此输入图像描述

应用卷积运算:

conv2 = torch.nn.Conv2d(1, 18, kernel_size=3, stride=1, padding=1)

image_d = torch.FloatTensor(np.asarray(random_image_arr.reshape(1, 1, 27 , 35))).numpy()

fc = conv2(torch.from_numpy(image_d))
Run Code Online (Sandbox Code Playgroud)

matplotlib.pyplot.imshow(fc[0][0].data.numpy())

渲染图像:

在此输入图像描述

McL*_*nce 5

您的代码有两个问题:

首先, 2d 卷积仅针对 4d 张量pytorch定义。这对于在神经网络中使用很方便。第一个维度是批量大小,第二个维度是通道(例如 RGB 图像具有三个通道)。所以你必须像这样重塑你的张量

image_d = torch.FloatTensor(np.asarray(random_image_arr.reshape(1, 1, 27 , 35)))
Run Code Online (Sandbox Code Playgroud)

在这里很FloatTensor重要,因为如果您的数组仅包含s,则卷积不会在 上定义LongTensor,它将自动创建。numpyint

其次,您创建了一个具有三个输入通道的卷积,而您的图像只有一个通道(它是灰度)。所以你必须将卷积调整为:

conv2 = torch.nn.Conv2d(1, 18, kernel_size=3, stride=1, padding=1)
Run Code Online (Sandbox Code Playgroud)