神经网络学习–用卷积神经网络进行图像识别「建议收藏」

神经网络学习–用卷积神经网络进行图像识别「建议收藏」卷积神经网络特别适合处理像图片、视频、音频、语言文字等,这些与相互位置有一定关系的数据。卷积神经网络(ConvolutionalNerualNetwork,CNN)为什么计算机可以处理图片–因为在计算机语言中图片可以用数字化,用四维数组来表示既然卷积神经网络可以处理图片,那么我们就要理解图片在计算机语言中是如何表达的。图片其实是“点阵”图,由一个个点按照一定的顺序组合而成,那我们就可以联想到一个概念–数组。图片可以分为三类:纯黑白图片、灰度图片、彩色图片关于图片数字化,以最.

大家好,又见面了,我是你们的朋友全栈君。

目录

卷积神经网络(Convolutional Nerual Network,CNN)

为什么计算机可以处理图–因为在计算机语言中图片可以用数字化,用四维数组来表示

卷积层定义

卷积层计算的代码实现

卷积神经网络(Convolutional Nerual Network,CNN)

卷积神经网络特别适合处理像图片、视频、音频、语言文字等,这些与相互位置有一定关系的数据。

卷积神经网络与多连接神经网络一样,都属于神经网络的一种类别,只是多连接神经网络的隐藏层的特点是称为多连接层的该层上的每一个节点与上一层的全部节点是全连接的关系,卷积神经网络的隐藏层上的每一个节点与上一层的全部节点直接并非是全部连接的关系,而是仅与一部分的节点有连接。神经网络学习--用卷积神经网络进行图像识别「建议收藏」神经网络学习--用卷积神经网络进行图像识别「建议收藏」

 

为什么计算机可以处理图片

–因为在计算机语言中图片可以用数字化,用四维数组来表示

既然卷积神经网络可以处理图片,那么我们就要理解图片在计算机语言中是如何表达的。图片其实是“点阵”图,由一个个点按照一定的顺序组合而成,那我们就可以联想到一个概念–数组。

图片可以分为三类:纯黑白图片、灰度图片、彩色图片

关于图片数字化,以最简单的纯黑白图片为例,我们可以用二维数组–矩阵来表示,比如h×w,高度h代表该点阵有多少行,也可以理解成每列有多少点;宽度w代表该点阵每行有多少点;通常我们说的摄像头是多少万像素,其实就是这个摄像头拍出来的照片保存成“点阵”图后的高度h和宽度w相乘的结果,如1900万×1250万这种写法。

上面说的是矩阵的维度,下面说矩阵中每个点的值所代表的含义。矩阵中每一个点一般叫“像素”,其值叫“像素值”,对于纯黑白图片,其像素值可以用0或1表示,0代表该点是白色,1代表该点是黑色;对于灰度图片,其像素值可以用[0,255]范围内的一个数字来代表黑色的深浅程度;对于彩色图片,每个点会用一个向量来表示,如RGB,即这个“点”此时是一个三维向量,RGB分别代表红色、绿色和蓝色,通常把这三项叫做该“点”颜色的通道,即分别为R通道、G通道、B通道。

这就意味着,世界上所有的图片,都可以数字化!图片数字化以后,就可以利用计算机语言中的数组来表达!这就是图片可以用计算机处理的第一步!

如下图,数字“2”的一个最简单的6×6的纯黑白图片的点阵图为:

神经网络学习--用卷积神经网络进行图像识别「建议收藏」

该点阵图的数字化表达为(用二维数组进行表达):

[[0,0,1,1,0,0],
[0,1,0,0,1,0],
[0,0,0,0,1,0],
[0,0,0,1,0,0],
[0,0,1,0,0,0],
[0,1,1,1,1,0]]

 

卷积层定义

同全连接层一样,卷积层也是神经网络中包含某一特点的一个隐藏层。该隐藏层的作用就是对输入层做卷积。要了解卷积层需要了解两个概念,一是卷积核,另一个是卷积运算。

卷积核是一个数字矩阵(英文是filter,或者kernel),卷积核的大小即该数字矩阵的维度。

卷积运算,见下图,卷积核与左侧的虚线框内的子矩阵先点乘,后求和。这个运算就是卷积运算。之后卷积核会继续与输入矩阵的第二个子矩阵进行同样的卷积运算。


神经网络学习--用卷积神经网络进行图像识别「建议收藏」

得到的卷积层输出矩阵有两种情况,①不填充节点0,则得到的输出矩阵维数会减小;②填充节点0,则得到的输出矩阵维数不变

神经网络学习--用卷积神经网络进行图像识别「建议收藏」神经网络学习--用卷积神经网络进行图像识别「建议收藏」

 

理解一下卷积运算的好处

①降低数据维度,不填充节点0,得到的输出矩阵维数会减小

②特征提取:卷积运算相当于把原图中相邻几个节点一起进行运算,得到一个数字,该数字包含了这几个节点的【综合数值】+【相对位置的信息】的特征(这是一个特征提取的过程)。举个栗子,图13.5中的数字5,在一定程度上代表了“2”字“向右上方转折”这一笔画特征,这是输入层的单个点所不能包含的信息。

③降低计算复杂度,利用上面的特征提取,可以利用特征来对图像进行识别,能比单点识别的运算量小。举个栗子,图13.5中的数字5,代表“2”字“向右上方转折”这一笔画特征,如果某图片的数字是“1”,进行卷积运算后得到的输出层相同位置的数字不是5,即可判断出,该数字不是2。而不用长篇幅的单点识别对比。通过特征提取,这个特征能用来识别是不是数字“2”的重要依据之一。

④增加卷积层的数量,可以把低级别的特征逐步提取成为高级别特征。—-这是卷积层的最重要的能力!!

 

卷积层计算的代码实现

import tensorflow as tf
xData=tf.constant([[[0],[0],[1],[1],[0],[0]],[[0],[1],[0],[0],[1],[0]],
                   [[0],[0],[0],[0],[1],[0]],[[0],[0],[0],[1],[0],[0]],
                   [[0],[0],[1],[0],[0],[0]],[[0],[1],[1],[1],[1],[0]]],dtype=tf.float32)
kernel=tf.constant([[[1],[2]],[[3],[4]]],dtype=tf.float32)
y=tf.nn.conv2d(input=tf.reshape(xData,[1,6,6,1]),filter=tf.reshape(kernel,[2,2,1,1]),striders=[1,1,1,1],padding='VALID')
sess=tf.Session()
result=sess.run(y)
print(y)

解释一下代码所用到的语句的意思

tf.constant是tf中生成一个不会改变的张量的函数,即常量张量

tf.nn.conv2d(input,filter,strides=[,,,],padding=)
tf.nn.conv2d的四个命名参数:
input是输入数据,input要求输入的数据是一个四维数组,上面xData我们定义的是一个三维数组,通过tf.reshape把三维的数组变成四维的数组输入给input。
其中第一个维度代表一次要处理的图片数量,第二、三个维度代表输入图片的h和w,第四个维度代表图片彩色的通道数。
这里我们把xData reshape成[1,6,6,1],即一次处理一张图片,该图片的h和w分别为6、6,黑白图片的通道数为1,把xData reshape后满足参数input的要求。
即记住input实际输入的是一个四维数组
简记input=[一次处理图片数量,h,w,通道数量]

filter是卷积核,要求输入的数据也是一个四维数组,简记filter=[h,w,输入通道数,输出通道数]
其中输入通道数和输出通道数一般都是相等的。
对于上面代码filter=tf.reshape(kernel,[2,2,1,1])中[2,2,1,1]的理解可以参照上段对input的理解。
且记住filter实际输入的是一个四维数组

strides=[,,,]输入的是一个四维的向量,用于指定卷积时卷积核移动的步长。
每个维度分别对应在输入数组(input)4个维度上的步长。
举个栗子:striders=[1,2,3,1],即代表对输入数组(input),每次处理1张图片,每张图片隔2步横着走,隔3步竖着走,在单个通道内走1步

padding只有两个值:'VALID' or 'SAME',前者代表不填充节点0,后者代表填充节点0

多说一句~这里提供的代码时1.x版本的tensorflow可运行的代码,如果安装的2.x版本的tensorflow可以在上段代码的前面加上下面两句话(本意是导入1.x版本的tensorflow且使得2.x版本的语句失效,不过这个方法会出现警告,有一天可能会失效~~)

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version.
Instructions for updating:
non-resource variables are not supported in the long term

#即disable_resource_variables在未来的版本中会被去掉

 

以上为作者学习《深度学习–基于Python语言和TensorFlow平台(视频讲解版)》对卷积神经网络的复习、理解加总结,如需学习更详尽的知识,请参考本书。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137862.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 人人工势场法

    人人工势场法人工势场法是局部路径规划的一种比较常用的方法。这种方法假设机器人在一种虚拟力场下运动。一、简介如图所示,机器人在一个二维环境下运动,图中指出了机器人,障碍和目标之间的相对位置。 这个图比较清晰的说明了人工势场法的作用,物体的初始点在一个较高的“山头”上,要到达的目标点在“山脚”下,这就形成了一种势场,物体在这种势的引导下,避开障碍物,到达目标点。

  • Integer比较

    Integer比较

  • Java 递归、DFS、回溯

    Java 递归、DFS、回溯DFS/回溯算法如果某问题的解可以由多个步骤得到,而每个步骤都有若干种选择(这些候选方案集可能会依赖之前做出的选择),且可以用递归枚举法实现,则它的工作方式可以用解答树来描述。全排列问题输出数字1~N所能组成的所有全排列publicclassA{/***全排列**@paramargs*/staticVector<Integer>vector=newVector<>();s

  • Python数组的使用_算法高效性

    Python数组的使用_算法高效性如果我们需要一个只包含数字的列表,那么使用数组方式比list方式更高效。而且数组还支持所有跟可变序列有关的操作,比如移除列表中的一个元素(.pop)、插入元素(.insert)和在列表末尾一次性追加另一个序列中的多个值(.extend)。除此之外,数组还定义从文件读取(.frombytes)与写入(.tofile)的效率更高的方法。创建数组需要一个类型码,形如array(‘d’),这个类型码是用来表示在底层实现的C语言的数据类型。一般我们用的Python底层是用C语言编写实现的&n

  • 2018即将结束,给寒假李哥flag

    2018即将结束,给寒假李哥flag

  • c++ uint32_t_int32和uint32

    c++ uint32_t_int32和uint32文章目录使用int64_t形式代替基本类型使用原因stdint.h源码int32_t和uint32_t的区别size_t在不同机器中定义不同:参考文档使用int64_t形式代替基本类型我们都知道,C语言的基本类型就char,short,int等。但是我们在看其他源码时经常碰到int32_t,int8_t这种形式的定义,他们是什么呢。其实他们就是基本类型的typedef重定义。也就是不同平台下,使用以下名称可以保证固定长度。1字节int8_t——char2字节int1

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号