tensorflow如何取平均_【他山之石】利用Tensorflow构建CNN图像多分类模型及图像参数、数据维度变化情况实例分析...

“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。

作者:CSDN—Ferris_YU_Q

地址:https://blog.csdn.net/hurry0808

本文以CIFAR-10(https://www.cs.toronto.edu/~kriz/cifar.html)为数据集,基于Tensorflow介绍了CNN(卷积神经网络)图像分类模型的构建过程,着重分析了在建模过程中卷积层、池化层、扁平化层、全连接层、输出层的运算机理,以及经过运算后图像尺寸、数据维度等参数的变化情况。

01

CIFAR-10数据集介绍CIFAR-10数据集由60000张彩色图片构成,其中包括50000张训练集图片、10000张测试集图片,每张图片的shape为(32,32,3),即图片尺寸为32*32,通道数为3;所有图片可以被分为10类,包括:
  • 飞机
  • 汽车
  • 鸟类
  • 鹿
  • 青蛙
  • 船只
  • 卡车
官网截图如下所示:
6672e6f98c9b31a684833123e552f785.png

02

利用Tensorflow构建CNN图像多分类模型TensorFlow™(https://www.tensorflow.org/?hl=zh-cn) 是一个使用数据流图进行数值计算的开放源代码软件库,其API可在Python、C++、Java、Go、Swift (Early Release)语言中调用,其中Python API是目前最完整且易用的。TensorFlow擅长训练深度神经网络,被认定为是神经网络中最好用的库之一。通过使用TensorFlow我们可以快速入门神经网络, 大大降低了深度学习(也就是深度神经网络)的开发成本和开发难度。
Tensorflow使用数据流图进行数值计算,图中的节点代表数学运算,图中的边代表在这些节点之间传递的多维数组(张量)。在使用其构建模型时,先搭建好流图结构——类似于铺好管道,然后再加载数据——向管道中注水,让数据在各节点计算、沿各管道流动;数据在流图中计算、传递时采用多维数组(张量)的形式,因此在Tensorflow中参与计算的均为数组数据类型。
本文使用Tensorflow构建简单的CNN图像多分类模型,其由3个卷积(含激活函数)与池化层、1个扁平层、3个全连接层、1个输出层构成,示意图如下所示:
a40228c6ebcc2edc4afc657f8468b5a6.png

输入(Input)层

图像数据经过标准化(normalize)、ont-hot编码等预处理后形成的4D张量,本文输入层张量shape为[batch, height, width, channels]。

卷积(Convolution)层

卷积层与池化层的作用在于:
1. invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度);
2. 保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力。卷积层计算的过程如下图所示:
0cea551a68e249ec74beba9e07c6afde.png
最左侧为输入层图像(加padding后的shape:(7,7,3)),中部为2个卷积核W0、W1及与之相对应的Bias b0、b1,最右侧为输入图像与核w0、w1进行卷积计算后的结果——前者对应于上部图、后者对应于下部图,卷积计算得到的结果即为feature map。每个卷积核与上层图像进行卷积运算后均会得到1个feature map。对于3通道图像,参考本图,卷积运算的过程如下:
1. 输入图像的每个通道分别从左上角开始,每次取与卷积核大小相同的部分(称之为patch),与卷积核对应部分分别相乘后再相加(内积运算);如R通道与W0的最上部核(0核)对应元素相乘再相加得到0,G通道与w0的1核做内积运算得到2,B通道与w0的2核做内积运算后得到0;
2. 内积运算得到的结果相加,再加上w0的bias值(b0),得到feature map左上的元素值;即0+2+0+1=3;
3. 按照指定步长移动卷积核,直至输入图像被整个覆盖,得到最终的feature map;本图中步长(stride)为(2,2)。这里是动图:

a56c4c26722edc212c0f3ac01552d60e.gif

Tensorflow实现卷积运算的函数为:
tf.nn.conv2d(    input,    filter,    strides,    padding,    use_cudnn_on_gpu=True,    data_format='NHWC',    dilations=[1, 1, 1, 1],    name=None)
参数说明如下:
  • input:需要做卷积的输入图像,它要求是一个Tensor,shape为[batch, in_height, in_width, in_channels],具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一;
  • filter:相当于CNN中的卷积核,它要求是一个Tensor,shape为[filter_height, filter_width, in_channels, out_channels],具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,filter的通道数要求与input的in_channels一致,有一个地方需要注意,第三维in_channels,就是参数input的第四维;
  • strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4,strides[0]=strides[3]=1;
  • padding:string类型的量,只能是”SAME”、”VALID”其中之一,这个值决定了不同的卷积方式;卷积运算时卷积核滑动过程中当输入图像(input)的in_height、in_width不是filter的filter_height、filter_width的整数倍时,”SAME”方式是在input周围填充0以将其in_height、in_width补充为filter相应部分的整数倍,”VALID”方式将input的多余部分丢弃,详细介绍请参看这里;
  • use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true;
  • data_format:指定输入数据、输出数据的格式,取值为”NHWC”、”NCHW”,前者对应于 [batch, height, width, channels],后者对应于 [batch, channels, height, width],默认为’NHWC’。
  • dilations:一个可选的ints列表;默认为[1,1,1,1]。长度为4的一维张量,每个input维度的膨胀系数;如果设置为k> 1,则每个该维度上的过滤器元素之间会有k-1个跳过的单元格;维度顺序由data_format的值决定;在Dilations中批次和深度尺寸必须为1;
  • name:为该操作指定名称;
  • 返回值:Tensor,也就是我们常说的feature map。
输入图像经过卷积运算后,其高度、宽度变为——
‘SAME’ 类型的padding,其输出的height和width计算如下:
out_height = ceil(float(in_height) / float(strides[1])) ceil:向上取整
out_width = ceil(float(in_width) / float(strides[2]))‘VALID’类型的padding, 其输出的height和width计算如下:
out_height = ceil(float(in_height – filter_height + 1) / float(strides[1]))
out_width = ceil(float(in_width – filter_width + 1) / float(strides[2]))验证该函数的文章,请看这里(https://blog.csdn.net/u012609509/article/details/71215859)。

激活函数(Activation Function)

池化层、全连接层等通过线性运算构建的是线性模型,该模型的表达能力有限;激活函数能够加入非线性因素,从而使模型的表达能力得到极大提升。常用的激活函数有Tanh函数 、ReLU函数 、Leaky ReLU函数 、Maxout函数 等,本文使用ReLU函数作为激活函数。
Tensorflow中的relu激活函数为:
tf.nn.relu(    features,    name=None)
参数说明如下:
  • features: 张量,必须为以下类型中的一种:float32, float64, int32, uint8, int16, int8, int64, bfloat16, uint16, half, uint32, uint64;
  • name: 为该操作指定名称;
  • Returns: 张量。

池化(Pooling)层

池化层与卷积层的作用、计算方法类似,也有池化filter、步长、填充方式等参数,所不同的是,池化计算比较简单,常取filter覆盖部分的最大值、或者均值,分别称之为最大池化、平均池化,最大池化的示意图如下所示:

8340317c1c8694b5f20df4d5c4c4ed0e.png

最大池化的filter shape为(2,2), 步长也为(2,2),每个filter滑动覆盖处取最大值,得到右侧所示的结果。
Tensorflow实现最大池化运算的函数为:
tf.nn.max_pool(    value,    ksize,    strides,    padding,    data_format='NHWC',    name=None)
参数说明如下:
  • value:输入4D张量, 其格式由data_format指定;
  • ksize:含有4个元素的1D张量,指定池化核的尺寸;
  • strides:含有4个元素的1D int 张量,指定池化时在图像每一维的步长,strides[0]=strides[3]=1;
  • padding:边界填充方式,string类型的量,只能是”SAME”、”VALID”其中之一;
  • data_format:数据格式,string类型的量, 只能是’NHWC’、 ‘NCHW’ 、’NCHW_VECT_C’ 其中之一;
  • name:为该操作指定名称;
  • 返回值:Tensor,也就是我们常说的feature map。
上层feature map经池化运算后,其batch、channels均不发生变化,只有height、width会发生变化,输出height、width计算方式同卷积层。

扁平化(Flatten)层

将上一层得到的全部feature map拉直成列向量,作为全连接网络的输入。拉直方式为height*width*channels。
Tensorflow实现扁平化层运算的函数为:
tf.contrib.layers.flatten(    inputs,    outputs_collections=None,    scope=None)
参数说明如下:
  • inputs:形如 [batch_size, …]的张量,注意张量的第1个元素必须为batch_size;
  • outputs_collections:添加到输出的集合;
  • scope:name_scope的可选范围。
  • 返回值:形如[batch_size, k]的扁平化张量。
图像分类模型训练完成后,本层返回张量的shape(主要是k)就确定了,从而限定了模型预测时输入图像的尺寸——因为在模型确定的情况下,卷积层、池化层等结构、数量均不再改变,预测图像与训练图像尺寸一致时,经卷积、池化等运算后,扁平化输出shape与模型一致;预测图像与训练图像尺寸不一致时,经卷积、池化等运算后,扁平化输出的shape与模型不一致,从而无法继续运算。这也是迁移学习时,预训练模型均约定输入图像height、width的原因。从该层开始,分类模型的网络结构类似于“多层前馈神经网络”。

全连接(Fully Connected)层

全连接层在整个卷积神经网络中起到“分类器”的作用、也是模型表示能力的“防火墙”。全连接层的运算形如X*W+b,X*W为矩阵乘法,其中X为输入2维数组(shape为[batch_size, k]),W为权重2维数组(shape为[k,out_k]),b为偏置,W的第2个元素(out_k)决定了全连接层运算后输出的2维数组形状(shape为[batch_size, out_k])。
由于全连接层参数冗余(仅全连接层参数就可占整个网络参数80%左右),需要使用tf.nn.dropout来随机丢弃一些节点,或者使用一些性能优异的网络模型如ResNet和GoogLeNet等来取代全连接层融合学到的深度特征。Tensorflow中实现全连接层的函数为:
tf.layers.dense(    inputs,    units,    activation=None,    use_bias=True,    kernel_initializer=None,    bias_initializer=tf.zeros_initializer(),    kernel_regularizer=None,    bias_regularizer=None,    activity_regularizer=None,    kernel_constraint=None,    bias_constraint=None,    trainable=True,    name=None,    reuse=None)
参数说明如下:
  • inputs: Tensor input.
  • units: Integer or Long, dimensionality of the output space.
  • activation: Activation function (callable). Set it to None to maintain a linear activation.
  • use_bias: Boolean, whether the layer uses a bias.
  • kernel_initializer: Initializer function for the weight matrix. If None (default), weights are initialized using the default initializer used by tf.get_variable.
  • bias_initializer: Initializer function for the bias.
  • kernel_regularizer: Regularizer function for the weight matrix.
  • bias_regularizer: Regularizer function for the bias.
  • activity_regularizer: Regularizer function for the output.
  • kernel_constraint: An optional projection function to be applied to the kernel after being updated by an Optimizer (e.g. used to implement norm constraints or value constraints for layer weights). The function must take as input the unprojected variable and must return the projected variable (which must have the same shape). Constraints are not safe to use when doing asynchronous distributed training.
  • bias_constraint: An optional projection function to be applied to the bias after being updated by an Optimizer.
  • trainable: Boolean, if True also add variables to the graph collection GraphKeys.TRAINABLE_VARIABLES (see tf.Variable).
  • name: String, the name of the layer.
  • reuse: Boolean, whether to reuse the weights of a previous layer by the same name.
  • Returns:Output tensor the same shape as inputs except the last dimension is of size units.
Tensorflow中的Dropout函数为:
tf.nn.dropout(    x,    keep_prob,    noise_shape=None,    seed=None,    name=None)
参数说明:
  • x: A floating point tensor.
  • keep_prob: A scalar Tensor with the same type as x. The probability that each element is kept.
  • noise_shape: A 1-D Tensor of type int32, representing the shape for randomly generated keep/drop flags.
  • seed: A Python integer. Used to create random seeds. See tf.set_random_seed for behavior.
  • name: A name for this operation (optional).
  • Returns: A Tensor of the same shape of x.

输出(Output)层

输出层运算与全连接层类似,只是在设定运算参数时输出节点数量需与分类标记数量相一致,并且在运算完成后再使用tf.nn.softmax函数,得到测试图像属于各分类的概率,该所有概率值之和为1。
Tensorflow中的tf.nn.softmax函数如下所示:
tf.nn.softmax(    logits,    axis=None,    name=None,    dim=None)
参数说明如下:
  • logits: A non-empty Tensor. Must be one of the following types: half, float32, float64.
  • axis: The dimension softmax would be performed on. The default is -1 which indicates the last dimension.
  • name: A name for the operation (optional).
  • dim: Deprecated alias for axis.
  • Returns: A Tensor. Has the same type and shape as logits.

训练得到分类模型

按照输入层、卷积层与池化层(共3层)、扁平化层、全连接层(共3层)、输出层的顺序搭建好模型,以交叉熵均值作为cost,以Adam优化算法寻找全局最优点,以cost、Accuracy(分类准确率)作为评估模型的指标,各层参数设置如下图所示:
4c568c944db92d0dfffe27b1bd93e475.png
补充说明如下:
  • batch为训练时每批输入的图像数量,视训练环境的硬件配置而定,本文设置为512
  • 卷积核height,width:(3,3)
  • 卷积步长:(1,1,1,1)
  • 卷积 padding:SAME
  • 激活函数:tf.nn.relu
  • 最大池化height,width:(2,2)
  • 最大池化步长:(1,2,2,1)
  • 池化 padding:SAME
  • Dropout时保留节点的比例:0.5
  • Epochs(训练轮数):30
训练构建好的CNN图像分类模型时,单张图片用3D数组表示,多张图片用4D数组表示,经过卷积、激活函数、池化、扁平化、全连接、Dropout等运算,其batch、height、width、channels、feature map数量、节点数量、数据shape有的会发生变化,有的不会发生变化,如下表所示:

717a6c6e80abac3da5a54f52af64a264.png

使用CIFAR-10训练集进行训练,在训练集和测试集上的准确率均为0.73,如下图所示:
75ebc8868a000b71a9a2635acb522efb.png

8622c0eecb83d72c2644a5c5db12db6a.png

03

小结

本文以CIFAR-10数据集为例,使用Tensorflow构建了简单的CNN图像分类模型,该模型包含输入层、卷积与池化层、扁平化层、全连接层、输出层,这些层均是构建CNN分类模型必要且重要的层;训练后分类模型的准确率虽然不够高,但本文重在分析各层运算时图像数据shape的变化及其它尺寸数据的改变情况。

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。

52eda39ef6e626218175ac5c67f1ac2a.png

他山之石”历史文章

  • pytorch中optimizer对loss的影响

  • 使用PyTorch 1.6 for Android

  • 神经网络解微分方程实例:三体问题

  • pytorch 实现双边滤波

  • 编译PyTorch静态库

  • 工业界视频理解解决方案大汇总

  • 动手造轮子-rnn

  • 凭什么相信你,我的CNN模型?关于CNN模型可解释性的思考

  • “最全PyTorch分布式教程”来了!

  • c++接口libtorch介绍& vscode+cmake实践

  • python从零开始构建知识图谱

  • 一文读懂 PyTorch 模型保存与载入

  • 适合PyTorch小白的官网教程:Learning PyTorch With Examples

  • pytorch量化备忘录

  • LSTM模型结构的可视化

更多他山之石专栏文章,

请点击文章底部“阅读原文”查看

c0695e097dbc733c8a55767116028a74.pngb2a0c9d094c1fa7e1c87c5bd8f47d2f2.gif

分享、点赞、在看,给个三连击呗!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为AR地图正式发布:每平方公里40亿三维信息点,1:1还原世界

来源:M数码4月8日晚,华为P40系列发布会上,余承东介绍了全新的华为AR地图,官方称实现了每平方公里40亿三维信息点,1:1还原真实世界。官方称华为AR地图是厘米级3D地图,每平方公里40亿三维信息点,1…

《全球创新观察》研究报告3月刊下发布

来源: 资本实验室大疫之下,全球产业格局有哪些变动?5G竞赛,又为哪些行业带来新风口?一起来看本期《全球创新观察》▼关于《全球创新观察》本报告是由国创会创新院(中国科学院国家创新与发展战略研究会创新驱…

学自动化必知:20个传感器原理及应用动图

来源:工业机器人1.探伤仪2.氧浓度传感器3.电容传感器4.差压式液位计(负迁移)5.差压式液位计(无迁移)6.差压式液位计(正迁移)7.料位计(称重式)8.电位式传感器9.电子吊称10…

解析|一文读懂AGV的关键技术——激光SLAM与视觉SLAM的区别

来源:新机器视觉移动机器人(AGV)是工业机器人的一种。它由计算机控制,具有移动、自动导航、多传感器控制、网络交互等功能,在实际生产中最主要的用途是搬运,可以说只要有搬运需求的地方,就有移动机器人的应用可能。近年…

远程服务器端口是否开放(审计)

定期对服务器进行扫描,将危险端口有开放的服务器记录日志或通过邮件、微信告警出来先定义服务器列表 iplist:10.10.0.5010.10.0.5110.10.0.52....检查端口过程如下: #!/bin/bashfor i in awk {print $1} iplist; do if [[ $(nmap $i -p 22 |g…

深度揭秘硅片产业,巨大潜力成就半导体材料之王

来源:智东西硅片是半导体材料的基石,它是先通过拉单晶制作成硅棒,然后切割制作成的。由于硅原子的价电子数为4,序数适中,所以硅元素具有特殊的物理化学性质,可用在化工、光伏、芯片等领域。特别是在芯片领域…

vr软件测试,如何进行VR可用性测试?

本文主要介绍如何进行VR可用性测试以及其与其他平台的测试有什么不同,帮助VR产品相关设计者快速进行可用性测试,提升产品质量及体验。一、可用性测试是什么简单说,可用性测试就是在不知道或者想确认产品问题点的情况下,通过用户测…

短信升级为5G消息?三大运营商联合发布的《5G消息白皮书》说了啥?

来源:帮尼资讯5G时代来临,基础消息服务迎来全新变革。4月8日上午10时许,中国电信、中国移动、中国联通联合举行线上发布会,发布《5G消息白皮书》。《5G消息白皮书》的发布,意味着三大运营商齐推出与以往短信完全不同的…

计算机会考咋查成绩,2019会考成绩查询网址入口 高中会考怎么查成绩

会考是高中生们在参加高考之前的一道基础的考试环节,只有通过了会考的考生才有资格参加高考。下文有途网小编给大家整理了会考成绩的查询入口及查询方式,供参考!会考成绩查询网址及查询方式普通高中的会考成绩也就是学业水平考试的成绩&#…

疫情影响全景图:疫情对各行业短中期影响!

来源: 中智科博海外大厂纷纷宣布停产,美国单周失业人数创新高。疫情使得海外大厂纷纷宣布停产,已宣布停产计划的知名企业涉及汽车、半导体、消费电子、飞机制造、奢侈品等行业,关联地区包括北美、欧洲、印度、东南亚等。美国三大汽…

我们为什么要探索人脑的奥秘?

来源:脑科学与智能技术卓越创新中心 4月5日21:30,4月11日9:00,CCTV-2央视财经频道《中国经济大讲堂》特邀中国科学院脑科学与智能技术卓越创新中心学术主任蒲慕明院士深度解读《我们为什么要探索人脑的奥秘?》未来智能实验室的主要…

DuiVision开发教程(19)-菜单

DuiVision菜单类是CDuiMenu。有两种显示的位置,一种是在窗体顶部某个button点击后能够下拉一个菜单,还有一种是托盘图标的右键菜单。 窗体中的菜单定义方式是xml文件里设置某个button的action属性,以menu:开头。后面是菜单的XML文件名称或XM…

值得收藏!深度报告解读NB-IoT

来源:物联传媒2019年NB-IoT行业获得了快速发展,用户数有望较2018年提升3倍以上,预计随着2020年基站数的大幅提升,为行业发展提供更进一步的支撑,加速技术成熟度提升,用户数有望保持快速增长。NB-IoT是万物互…

我的世界中国版服务器无限夜视,我的世界服务器游戏技巧 无限夜视的方法

来源:游戏园日期:2019-06-12 04:03:49我的世界服务器游戏技巧 无限夜视的方法。那下面给大家分享的是一些大家可能不知道的游戏技巧,那下面就一起来看看都是些什么技巧吧!对了,里面还有关于服务器无限夜视的方法哦&…

Oracle锁表查询和解锁方法

数据库操作语句的分类 DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert、delete、updateDCL:数据库控制语言 ,关键字:grant、removeDQL&#xff1a…

揭秘5G+AI时代的机器人世界!七大核心技术改变人类生活

来源:世界人工智能大会 AI 和 5G 与机器人技术结合,正在不断催生新的消费电子品类。AI 解决机器理解世界,以及人机交互的问题。5G 拓展机器人的活动边界,并为机器人提供更大的算力和存储空间(云协作机器人)…

服务器热修复,热修复探究,hotfix,patch

常见场景App打包发出后1.忘了关掉Log输出了2.存在一个业务逻辑触发必崩溃3.某个本地图标忘了替换成新的遇到这些问题,若是Web站点,Mobile站点问题都不大,因为这些具有“持续发布”的特长,但是App的特点是“版本发布”,…

html5 填表 表单 input output 与表单验证

1.<output> Js计算结果 <form οninput"res.value num1.valueAsNumber*num2.valueAsNumber"> <input type"number" id"num1"> X <!-- 没有闭合</input> --> <input type"number" id…

人工智能如何获得知识?

原发&#xff1a;人民论坛学术前沿 2019年21期转自&#xff1a;南京大学哲学系摘要&#xff1a;人构造概念以认识世界&#xff0c;人的认知与人的身体密切相关。计算机是人类心灵的延伸&#xff1b;而人类发明的各种认知用仪器&#xff08;机器&#xff09;是人类感官的延伸&am…

报告:美国AI投资占全球56% 中国第二增长最快

来源&#xff1a;小小据外媒报道&#xff0c;由英国政府资助的科技企业家网络Tech Nation日前发布最新报告。报告显示了2015年至2019年各国企业在全球范围内获得的人工智能(AI)领域的投资情况。在这五年期间&#xff0c;美国吸引了全球56%的AI投资&#xff0c;紧随其后的是中国…