要渲染形状为 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())
渲染图像:
您的代码有两个问题:
首先, 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)