多输入通道、多输出通道和批量操作是处理复杂关系和深度学习时不可避免地操作:
多输入-->多输出-->批量操作 这样的关系可以有所逻辑。
多输入通道影响到卷积核的数目,令卷积核的三维层面的数目于输入通道三维层面的数目保持一致。
多输出通道影响到卷积核的数目,令卷积核的四维层面的数目于输出通道的数目保持一致。
上述两种情景不会对最后的卷积求和有影响,但是批量操作会有,因为批量操作对输入通道的四维数目做出了改变。
Paddel规定的API:
通过对卷积核的不同选取,我们可以达到不同的目的,卷积核是我们要操作的行为的体现,彰显着行为的目的。比如我们想边沿化图片,那我们就可以使用锐化卷积核,并令和为0获取更强的边缘化能力。
简单的黑白边界检测:
import matplotlib.pyplot as plt
import numpy as np
import paddle
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
%matplotlib inline
w = np.array([1, 0, -1], dtype='float32') # 初始权重输入, 卷积核是我们要操作的行为的体现,彰显着行为的目的
w = w.reshape([1, 1, 1, 3]) # 转变为paddel库API规定的数据维度
# 卷积算子规定,API规定的模式输入
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[1, 3],
weight_attr=paddle.ParamAttr(
initializer=Assign(value=w)))
# 定义要区分的图片
img = np.ones([50,50], dtype='float32')
img[:, 30:] = 0. # 分片操作规定前30列为0
x = img.reshape([1,1,50,50])
x = paddle.to_tensor(x) # 转变为tensor
y = conv(x)
out = y.numpy() # 转变为ndarray
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img, cmap='gray')
f = plt.subplot(122)
f.set_title('output featuremap', fontsize=15)
plt.imshow(out.squeeze(), cmap='gray')
plt.show()
print(conv.weight)
print(conv.bias)
图像中物体边缘检测:
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('./work/tianan.jfif')
w = np.array([[-1,-1,-1], [-1,8,-1], [-1,-1,-1]], dtype='float32')/8 # 设置卷积核参数, 这里采用锐化卷积核并令总和为零获得较强的边沿化能力
w = w.reshape([1, 1, 3, 3])
# 图片以RGB三通道输入,输入通道数是3,将卷积核的形状从[1,1,3,3]调整为[1,3,3,3] API规定
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))
# 将数据形状调整为API格式
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()
图像均值模糊:
import paddle
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
# 读入图片并转成numpy.ndarray
# 换成灰度图
img = Image.open('./work/tianan.jfif').convert('L')
img = np.array(img)
# 创建初始化参数
w = np.ones([1, 1, 5, 5], dtype = 'float32')/25 # 5*5的卷积核中每个值均为1
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[5, 5],
weight_attr=paddle.ParamAttr(
initializer=Assign(value=w)))
x = img.astype('float32')
x = x.reshape(1,1,img.shape[0], img.shape[1])
x = paddle.to_tensor(x)
y = conv(x)
out = y.numpy()
plt.figure(figsize=(20, 12))
f = plt.subplot(121)
f.set_title('input image')
plt.imshow(img, cmap='gray')
f = plt.subplot(122)
f.set_title('output feature map')
out = out.squeeze()
plt.imshow(out, cmap='gray')
plt.show()