Pytorch:使用 conv2d 在一张图片上应用一批过滤器(内核)

Pyorch: Applying a batch of filters (kernels) on one single picture using conv2d

我有一批过滤器,即w,其大小为torch.Size([64, 3, 7, 7])如下:

另外,我有一张来自Imagenet的图片p如下:

如何将滤镜应用于图片并获得 64x64 的网格,其中每个单元格都包含应用了不同滤镜的相同图片?我想使用 torchvision.utils.make_grid 制作网格,但不知道怎么做?

我的尝试

y = F.conv2d(p, w)

y 的大小是 torch.Size([1, 64, 250, 250]),这对我来说没有意义。

您的每个过滤器的大小都为 [3, 7, 7],因此它们会采用 RGB 图像并生成单通道输出,该输出堆叠在通道维度中,因此您的输出 [1, 64, H, W] 非常有意义。

可视化这些过滤器:

import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
from torchvision import transforms
from PIL import Image

import matplotlib.pyplot as plt

torch.random.manual_seed(42)

transform = transforms.Compose([transforms.ToTensor()])
img = transform(Image.open('dog.jpg')).unsqueeze(0)
print('Image size: ', img.shape)

filters = torch.randn(64, 3, 7, 7)

out = F.conv2d(img, filters)
print('Output size: ', out.shape)

list_of_images = [out[:,i] for i in range(64)]

grid = torchvision.utils.make_grid(list_of_images, normalize=True)
plt.imshow(grid.numpy().transpose(1,2,0))
plt.show()

这是更准确的输出表示。然而它不是很吸引人——我们可以通过独立处理每个颜色通道来获得彩色版本。 (灰度版本可以通过对颜色通道求和得到)

color_out = []
for i in range(3):
    color_out.append(F.conv2d(img[:,i:i+1], filters[:,i:i+1]))
out = torch.stack(color_out, 2)
print('Output size: ', out.shape)

list_of_images = [out[0,i] for i in range(64)]
print(list_of_images[0].shape)

grid = torchvision.utils.make_grid(list_of_images, normalize=True)
plt.imshow(grid.numpy().transpose(1,2,0))
plt.show()