案例1——简单黑白边界检测

下面是使用Conv2D算子完成一个图像边界检测的任务。图像左边为光亮部分,右边为黑暗部分,需要检测出光亮跟黑暗的分界处。

设置宽度方向的卷积核为[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
w = np.array([1, 0, -1], dtype='float32')
# 将权重参数调整成维度为[cout, cin, kh, kw]的四维张量
w = w.reshape([1, 1, 1, 3])
# 创建卷积算子,设置输出通道数,卷积核大小,和初始化权重参数
# kernel_size = [1, 3]表示kh = 1, kw=3
# 创建卷积算子的时候,通过参数属性weight_attr指定参数初始化方式
# 这里的初始化方式时,从numpy.ndarray初始化卷积参数
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[1, 3],weight_attr=paddle.ParamAttr(initializer=Assign(value=w)))# 创建输入图片,图片左边的像素点取值为1,右边的像素点取值为0
img = np.ones([50,50], dtype='float32')
img[:, 30:] = 0.
# 将图片形状调整为[N, C, H, W]的形式
x = img.reshape([1,1,50,50])
# 将numpy.ndarray转化成paddle中的tensor
x = paddle.to_tensor(x)
# 使用卷积算子作用在输入图片上
y = conv(x)
# 将输出tensor转化为numpy.ndarray
out = y.numpy()
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)
# 卷积算子Conv2D输出数据形状为[N, C, H, W]形式
# 此处N, C=1,输出数据形状为[1, 1, H, W],是4维数组
# 但是画图函数plt.imshow画灰度图时,只接受2维数组
# 通过numpy.squeeze函数将大小为1的维度消除
plt.imshow(out.squeeze(), cmap='gray')
plt.show()# 查看卷积层的权重参数名字和数值
print(conv.weight)
# 参看卷积层的偏置参数名字和数值
print(conv.bias)

结果图案为:

案例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 Assignimg = Image.open('C:\\Users\\lenovo\\Desktop\\作业\\卷积\\bg\\bg1.jpg')# 设置卷积核参数
w = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32') / 8
w = w.reshape([1, 1, 3, 3])
# 由于输入通道数是3,将卷积核的形状从[1,1,3,3]调整为[1,3,3,3]
w = np.repeat(w, 3, axis=1)
# 创建卷积算子,输出通道数为1,卷积核大小为3x3,
# 并使用上面的设置好的数值作为卷积核权重的初始化参数
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()

结果图案为:

案例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('C:\\Users\\lenovo\\Desktop\\作业\\卷积\\bg\\bg3.jpg').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()

结果图案如下:

ReLU函数:

前面介绍的网络结构中,普遍使用Sigmoid函数做激活函数。在神经网络发展的早期,Sigmoid函数用的比较多,而目前用的较多的激活函数是ReLU。这是因为Sigmoid函数在反向传播过程中,容易造成梯度的衰减。让我们仔细观察Sigmoid函数的形式,就能发现这一问题。

Sigmoid激活函数定义如下:

ReLU激活函数的定义如下:

下面的程序画出了Sigmoid和ReLU函数的曲线图:

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)s = 1.0 / (1 + np.exp(0. - x))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()

结果图案如下:

关于卷积神经网络的案例以及ReLU函数相关推荐

  1. 热文 | 卷积神经网络入门案例,轻松实现花朵分类

    作者 | 黎国溥 责编 | 寇雪芹 出品 | AI 科技大本营(ID:rgznai100) 前言 本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对几种常见的花朵进行识别分类:使用到TF的花 ...

  2. 卷积神经网络——通过案例对原理进行剖析(MNIST识别和狗狗分类)

    卷积神经网络 计算机视觉利器--卷积神经网络. 卷积神经网络,简称为卷积 网络,与普通神经网络的区别是它的卷积层内的神经元只覆盖输入特征局部范围的单元 ,具有稀疏连接和权重共享的特点,而且其中的过滤器 ...

  3. CNN卷积神经网络 入门案例

    数据介绍 Clifar 10 数据集 5w张 32x32 的图片 训练 1w张 32x32 的图片 测试 输入是分为10个标签,下面的图的左边已经给出了. 导入数据集 可视化一张图片看看 打印出 x的 ...

  4. 【神经网络】(3) 卷积神经网络(CNN),案例:动物三分类,附python完整代码

    各位同学好,今天和大家分享一下TensorFlow2.0深度学习中卷积神经网络的案例.现在有猫.狗.熊猫图片一千张,构建卷积神经网络实现图像的分类预测. 1. 数据加载 将训练测试数据划分好后放在同一 ...

  5. 深度学习实战——利用卷积神经网络对手写数字二值图像分类(附代码)

    系列文章目录 深度学习实战--利用卷积神经网络对手写数字二值图像分类(附代码) 目录 系列文章目录 前言 一.案例需求 二.MATLAB算法实现 三.MATLAB源代码 参考文献 前言 本案例利用MA ...

  6. 【综述】一文读懂卷积神经网络(CNN)

    卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习 ...

  7. 理解卷积神经网络的利器:9篇重要的深度学习论文(上)

    摘要: 为了更好地帮助你理解卷积神经网络,在这里,我总结了计算机视觉和卷积神经网络领域内许多新的重要进步及有关论文. 手把手教你理解卷积神经网络(一) 手把手教你理解卷积神经网络(二) 本文将介绍过去 ...

  8. NNDL 实验六 卷积神经网络(3)LeNet实现MNIST

    目录 5.3 基于LeNet实现手写体数字识别实验 5.3.1 数据 5.3.2 模型构建 5.3.3 模型训练 5.3.4 模型评价 5.3.5 模型预测 使用前馈神经网络实现MNIST识别,与Le ...

  9. 【论文翻译】卷积神经网络研究综述

    论文题目:卷积神经网络研究综述 论文来源:卷积神经网络研究综述 翻译人:BDML@CQUT实验室 卷积神经网络研究综述 Review of Convolutional Neural Network 周 ...

最新文章

  1. python3 pyinstaller 打包后 程序会显示两个进程 解决方法
  2. iOS开发知识点总结
  3. java取geosever数据,终于搞定了GeoServer的WFS查询
  4. Laravel 全文检索 Scout集成Algolia
  5. matlab如何实现隔直滤波器,matlab的滤波器仿真——低通滤波器与插值滤波器
  6. VSCode插件-萌妹音彩虹屁,还需要鼓励师作甚?
  7. 【信源编码】Huffman Coding原理以及MATLAB实现
  8. IEC104 规约详细解读(一) 协议结构
  9. ADO 笔记 ——关于RecordCount
  10. Python数据加密与解密相关操作(hashlib、hmac、random、base64、pycrypto)
  11. 最简单的计算机原理,【图片】【技术帖】从原子到计算机(计算机原理纯正技术帖,简单且通俗)_计算机吧_百度贴吧...
  12. 通用计算机按其规模速度和功能,电脑基础知识详解
  13. 聊一聊异构系统间数据一致性
  14. 蓝桥杯 核桃的数量(python)
  15. 使用Python构建参数化FNN(一)——构建可自定义结构的FNN
  16. 全网最细的Spring教程(一)
  17. Mysql查看表的数据量
  18. PHP关于生成6位唯一固定邀请码,附带加密解密(终于可以不用存数据库啦)
  19. 欧姆龙CK3M与松下A6伺服驱动配置——位置模式
  20. 微推圈短视频获客系统添加视频的几种方法

热门文章

  1. 《微SaaS创富周刊》第8期:奇葩!产品卖2次共赚5000万美元,盘点16个视频创富项目
  2. 怎么才能制作出优秀的网页
  3. 7.1、BMP280气压计
  4. 中文生成模型T5-Pegasus详解与实践
  5. Elasticsearch查询相关参数
  6. 数据库Schema两种含义
  7. IOS 百度语音使用
  8. 蓝桥杯2019试题J扫地机器人
  9. 工信部介入 微信收费或成定局
  10. 购物车html页面,简单实用的商品购物和添加购物车界面设计