Применение операции свертки к изображению - PyTorch - PullRequest
0 голосов
/ 30 июня 2018

Для рендеринга изображения, если форма 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))
* 1 037 * matplotlib.pyplot.imshow (к [0] [0] .data.numpy ())

делает изображение:

enter image description here

1 Ответ

0 голосов
/ 30 июня 2018

Есть две проблемы с вашим кодом:

Во-первых, двумерные свертки в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...