第十三次作业 卷积神经网络相关代码学习

物联202  邱郑思毓  2008070213

作业要求:根据学习知识以及paddlepaddle中的代码进行学习编写。

完成情况:

        通过初步了解卷积神经网络,我了解到卷积神经网络计算时,是如下的方式:

                                             第十三次作业 卷积神经网络相关代码学习_第1张图片

            以及每个feature map的计算公式为:

                                   

通过改变filter中数值(即w)和移动的步数,可以获取多种的卷积结果。

卷积神经网络中运用到的relu函数的python编写:

# ReLU和Sigmoid激活函数示意图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
plt.figure(figsize=(10, 5))

x = np.arange(-10, 10, 0.1)   # 创建数据x

# 计算Sigmoid函数
s = 1.0 / (1 + np.exp(0. - x))

# 计算ReLU函数
y = np.clip(x, a_min=0., a_max=None)

f = plt.subplot(121)
plt.plot(x, s, color='r')
currentAxis=plt.gca()
plt.text(-9.0, 0.9, r'$y=Sigmoid(x)$', fontsize=13)
currentAxis.xaxis.set_label_text('x', fontsize=15)
currentAxis.yaxis.set_label_text('y', fontsize=15)

f = plt.subplot(122)
plt.plot(x, y, color='g')
plt.text(-3.0, 9, r'$y=ReLU(x)$', fontsize=13)
currentAxis=plt.gca()
currentAxis.xaxis.set_label_text('x', fontsize=15)
currentAxis.yaxis.set_label_text('y', fontsize=15)

plt.show()

不使用sigmod函数的原因是因为SIGMOD函数有梯度消失现象,当数据太大时,SIGMOD函数趋近于1,不符合卷积运算的要求。ReLU函数则不同,虽然在x<0x\lt 0x<0的地方,ReLU函数的导数为0。但是在x≥0x\ge 0x≥0的地方,ReLU函数的导数为1,能够将yyy的梯度完整的传递给xxx,而不会引起梯度消失。

paddle中实例的运用:

1.简单的黑白边界检测

       设置宽度方向的卷积核为[1,0,−1][1, 0, -1][1,0,−1],此卷积核会将宽度方向间隔为1的两个像素点的数值相减。当卷积核在图片上滑动时,如果它所覆盖的像素点位于亮度相同的区域,则左右间隔为1的两个像素点数值的差为0。只有当卷积核覆盖的像素点有的处于光亮区域,有的处在黑暗区域时,左右间隔为1的两个点像素值的差才不为0。将此卷积核作用到图片上,输出特征图上只有对应黑白分界线的地方像素值才不为0。

import matplotlib.pyplot as plt
import numpy as np
import paddle
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign


w = np.array([1, 0, -1], dtype='float32')# 创建初始化权重参数w

w = w.reshape([1, 1, 1, 3])# 将权重参数调整成维度为[cout, cin, kh, kw]的四维张量

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')# 创建输入图片,图片左边的像素点取值为1,右边的像素点取值为0
img[:, 10:] = 0.#创建的图片中 横坐标“10”以前的部分为亮部,之后的为暗部
x = img.reshape([1,1,50,50])# 将图片形状调整为[N, C, H, W]的形式
x = paddle.to_tensor(x)# 将numpy.ndarray转化成paddle中的tensor
y = conv(x)# 使用卷积算子作用在输入图片上

out = y.numpy()    # 将输出tensor转化为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)

print(conv.weight)# 查看卷积层的权重参数名字和数值
print(conv.bias)# 参看卷积层的偏置参数名字和数值

plt.imshow(out.squeeze(), cmap='gray')
plt.show()

结果显示:

第十三次作业 卷积神经网络相关代码学习_第2张图片

2.图像中物体边缘检测

       运用卷积核(3*3卷积核的中间值是8,周围一圈的值是8个-1)对其进行操作,用来检测物体的外形轮廓,观察输出特征图跟原图之间的对应关系。

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('./3.webp')

# 设置卷积核参数
w = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32') / 8
#设置为中间为8周围为-1的矩阵用于卷积得出图像的边界
w = w.reshape([1, 1, 3, 3])

w = np.repeat(w, 3, axis=1)# 由于输入通道数是3,将卷积核的形状从[1,1,3,3]调整为[1,3,3,3]
conv = Conv2D(in_channels=3, out_channels=1, kernel_size=[3, 3],
              weight_attr=paddle.ParamAttr(
                  initializer=Assign(value=w)))

x = np.array(img).astype('float32')   # 将读入的图片转化为float32类型的numpy.ndarray
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()

结果为:

第十三次作业 卷积神经网络相关代码学习_第3张图片

 由此可见,将向日葵的轮廓提取出来。

3.图像均值模糊

       运用卷积核(5*5的卷积核中每个值均为1)是用当前像素跟它邻域内的像素取平均,这样可以使图像上噪声比较大的点变得更平滑。

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('./3.webp').convert('L')
img = np.array(img)

# 创建初始化参数
w = np.ones([1, 1, 5, 5], dtype = 'float32')/25
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()

结果为:

第十三次作业 卷积神经网络相关代码学习_第4张图片

将图像进行了模糊处理,使图像进行了“降维操作”。

附:为得到更模糊的图片,我们对选取的矩阵进行更改,扩大范围取平均值,可以使模糊范围更大,从而满足需求。

此时,只需要将这里本来是5*5的矩阵改为10*10,便可以进一步模糊化。 

得出结果:

第十三次作业 卷积神经网络相关代码学习_第5张图片

你可能感兴趣的:(1024程序员节)