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

时间:2018-06-30 13:40:36

标签: 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))

这将生成:

enter image description here

然后我尝试使用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))

但这会显示错误:

~/.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

输入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))

这将渲染图像:

enter image description here

应用卷积运算:

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))

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

提供图片:

enter image description here

1 个答案:

答案 0 :(得分:1)

您的代码有两个问题:

首先,class Circle { constructor(opt) { this.x = opt.x; this.y = opt.y; this.radius = opt.radius; this.color = opt.color; } draw() { let div = document.createElement('div'); div.style.width = this.radius + 'px'; div.style.height = this.radius + 'px'; div.style.border = '1px solid;'; div.style.borderRadius = '50%'; div.style.backgroundColor = this.color; document.body.appendChild(div); } } let options = { x: 1500, y: 100, radius: 100, color: 'red' }; let circle = new Circle(options); circle.draw();中的2d卷积仅对于4d张量为defined。 这在神经网络中使用很方便。第一维是批次大小,而第二维是通道(例如,RGB图像具有三个通道)。所以你必须像重塑张量

pytorch

image_d = torch.FloatTensor(np.asarray(random_image_arr.reshape(1, 1, 27 , 35))) 在这里很重要,因为在FloatTensor数组仅包含LongTensor的情况下,numpy上不会自动创建卷积。

第二,您创建了具有三个输入通道的卷积,而图像只有一个通道(灰度)。因此,您必须将卷积调整为:

int