我有一批过滤器,即 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])
,这对我来说没有意义。
答案 0 :(得分:3)
您的每个过滤器的大小为 [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()