Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 卷积运算在图像压缩中的应用_Python_Pytorch - Fatal编程技术网

Python 卷积运算在图像压缩中的应用

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

要渲染图像(如果使用形状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.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没有,只是觉得分享实现可能有用。