Python 卷积运算在图像压缩中的应用
要渲染图像(如果使用形状27x35),请执行以下操作:Python 卷积运算在图像压缩中的应用,python,pytorch,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)) 这将产生: 然后,我尝试使用torch.n
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))
这将产生:
然后,我尝试使用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
输入的图像的形状是(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))
这将渲染图像:
应用卷积运算:
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())
渲染图像:
您的代码有两个问题:
首先,pytorch
中的二维卷积仅适用于4d张量。
这便于在神经网络中使用。第一个维度是批次大小,而第二个维度是通道(例如,RGB图像有三个通道)。所以你必须重塑你的张量
image_d = torch.FloatTensor(np.asarray(random_image_arr.reshape(1, 1, 27 , 35)))
FloatTensor
在这里很重要,因为卷积不是在LongTensor
上定义的,如果numpy
数组只包含int
s,卷积将自动创建
其次,您创建了一个包含三个输入通道的卷积,而您的图像只有一个通道(灰度)。因此,必须将卷积调整为:
conv2 = torch.nn.Conv2d(1, 18, kernel_size=3, stride=1, padding=1)
@McLawrence没有,只是觉得分享实现可能有用。