目录
1.问题介绍
常用的参数如下:
in_channels(int):输入图像的通道数。
out_channels(int):卷积核的个数,和输出特征图通道数相同,相当于上文中的
。
kernel_size(int|list|tuple):卷积核大小,可以是整数,比如3,表示卷积核的高和宽均为3;或者是两个整数的list,例如[3,2],表示卷积核的高为3,宽为2。
stride(int|list|tuple,可选):步长大小可以是整数,默认值为1,表示垂直和水平滑动步幅均为1;或者是两个整数的list,例如[3,2],表示垂直滑动步幅为3,水平滑动步幅为2。
padding(int|list|tuple|str,可选):填充大小,可以是整数,比如1,表示竖直和水平边界填充大小均为1;或者是两个整数的list,例如[2,1],表示竖直边界填充大小为2,水平边界填充大小为1。
对于真实的图片,也可以使用合适的卷积核(3*3卷积核的中间值是8,周围一圈的值是8个-1)对其进行操作,用来检测物体的外形轮廓,观察输出特征图与原图之间的对应关系。
2.代码实例
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可:
# Also add the following code,
# so that every time the environment (kernel) starts,
# just run the following code:
import sys
sys.path.append('/home/aistudio/external-libraries')
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import paddle
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
img = Image.open('/home/aistudio/86411667216592.jpg')
#设置卷积核参数
w = np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]], dtype='float32')/8
w =w.reshape([1, 1, 3, 3])
w = np.repeat(w, 3, axis =1)
conv = Conv2D(in_channels=3, out_channels=1, kernel_size=[3, 3],
weight_attr=paddle.ParamAttr(
initializer=Assign(value=w)))
#将读入的图片转化为float32类型的numpy.ndarray
x = np.array(img).astype('float32')
#图片读入成ndarry时,形状是[H,W,3]
#将通道这一维度调整到最前面
x = np.transpose(x, (2,0,1))
#将数据形状调整为[N,C,H,W]格式
x = x.reshape(1, 3, img.height, img.width)
x = paddle.to_tensor(x)
y = conv(x)
out = y.numpy()
plt.figure(figsize=(20, 10))
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img)
f = plt.subplot(122)
f.set_title('output feature map', fontsize=15)
plt.imshow(out.squeeze(), cmap='gray')
plt.show()