如果您尝试在 RGB 图像上实现 Conv2d,那么在 pytorch 中的实现应该会有所帮助。
抓取一张图片并将其设为 uint8 (note that imshow needs uint8 to be values between 0-255 whilst floats should be between 0-1) 的 numpy ndarray:
link = 'https://oldmooresalmanac.com/wp-content/uploads/2017/11/cow-2896329_960_720-Copy-476x459.jpg'
r = requests.get(link, timeout=7)
im = Image.open(BytesIO(r.content))
pic = np.array(im)
您可以查看它
f, axarr = plt.subplots()
axarr.imshow(pic)
plt.show()
创建您的卷积层(以随机权重开始)
conv_layer = nn.Conv2d(in_channels=3,
out_channels=3,kernel_size=3,
stride=1, bias=None)
将输入图像转换为浮动并添加一个空维度,因为这是 pytorch 期望的输入
pic_float = np.float32(pic)
pic_float = np.expand_dims(pic_float,axis=0)
通过卷积层运行图像(置换维度位置周围的变化,使其与 pytorch 的预期相匹配)
out = conv_layer(torch.tensor(pic_float).permute(0,3,1,2))
移除我们添加的额外的第一个暗淡(可视化不需要),从 GPU 分离并转换为 numpy ndarray
out = out.permute(0,2,3,1).detach().numpy()[0, :, :, :]
可视化输出(我们开始使用转换为 uint8)
f, axarr = plt.subplots()
axarr.imshow(np.uint8(out))
plt.show()
然后,您可以通过访问过滤器来更改它们的权重。例如:
kernel = torch.Tensor([[[[0.01, 0.02, 0.01],
[0.02, 0.04, 0.02],
[0.01, 0.02, 0.01]]]])
kernel = kernel.repeat(3, 3, 1, 1)
conv_layer.weight.data = kernel