针对一张图像,经过二维卷积后的输出会是什么样的呢?
下边使用一张图像展示经过卷积后,输出的特征映射的结果
##导包
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image ##PIL包读取图像数据
##读取图像 转化为灰度图像 转化为numpy数组
myim = Image.open("../input/images/lena.jpg")
myimgray = np.array(myim.convert("L"),dtype = np.float32)
##可视化图像
plt.figure(figsize = (6,6))
plt.imshow(myimgray,cmap = plt.cm.gray)
plt.axis("off")
plt.show()
##见下图
##转化为1*1*512*512的张量
imh,imw = myimgray.shape
myimgray_t = torch.from_numpy(myimgray.reshape((1,1,imh,imw)))
myimgray_t.shape
##torch.Size([1, 1, 512, 512])
##对灰度图像进行卷积提取图像轮廓
kersize = 5
ker = torch.ones(kersize,kersize,dtype = torch.float32)*-1
ker[2,2] = 24
ker = ker.reshape((1,1,kersize,kersize))
print(ker) ##图像轮廓提取卷积核
# tensor([[[[-1., -1., -1., -1., -1.],
# [-1., -1., -1., -1., -1.],
# [-1., -1., 24., -1., -1.],
# [-1., -1., -1., -1., -1.],
# [-1., -1., -1., -1., -1.]]]])
##进行卷积操作
conv2d = nn.Conv2d(1,2,(kersize,kersize),bias = False)
conv2d.weight.data[0] = ker ##设置卷积时使用的核,第一个核使用图像轮廓提取卷积核
##对灰度图像进行卷积操作
imconv2out = conv2d(myimgray_t)
##对卷积后的图像进行维度压缩
imconv2out_im = imconv2out.data.squeeze()
print("卷积后尺寸:",imconv2out_im.shape)
#卷积后尺寸: torch.Size([2, 508, 508])
##可视化卷积后的图像
plt.figure(figsize = (12,6))
plt.subplot(1,2,1)
plt.imshow(imconv2out_im[0],cmap = plt.cm.gray)
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(imconv2out_im[1],cmap = plt.cm.gray)
plt.axis("off")
plt.show()
##见下图
在对图像进行卷积操作后,获得两个特征映射。第一个特征映射使用图像轮廓提取卷积核,第二个特征映射使用随机数卷积核,卷积核大小为5×5,对图像的边缘不使用0填充,所以卷积后输出特征映射的尺寸为508×508。
从输出结果左图可以看出,所使用的边缘特征提取卷积核很好的提取出了图像的边缘信息。而右边图像使用的卷积核为随机数,得到的卷积结果与原始图像很相似。