tensorflow框架学习 (九)—— CNN卷积神经网络的实现

一、卷积神经网络

1、关于卷积神经网络的知识,这里推荐一个博客,可以通过几篇博文来了解卷积神经网络:https://www.cnblogs.com/pinard/category/894694.html

2、关于张量经过卷积与池化后数据各维度大小的变化:

设原图片数据维度为$batch*width*height*channel$:$batch$为图片张数,$width$为图宽,$height$为图高,$channel$为图通道数。

卷积:

设卷积核为$padding*cwidth*cheight$:padding层数为$padding$,卷积核宽$cwidth$,卷积核高$cheight$;卷积步长$wstride*hstride$,宽为$wstride$,高为$hstride$;卷积核个数为$cchannel$。

经过卷积后的图片张数:

$$batch^{‘}=batch$$

经过卷积后的宽:

$$weight^{‘}=(\frac{width+2padding-cwith}{wstride}+1)$$

经过卷积后的高:

$$height^{‘}=(\frac{width+2padding-cheight}{hstride}+1)$$

经过卷积后的通道数:

$$channel^{‘}=cchannel$$

经过卷积后的图片数据为:

$$batch^{‘}*width^{‘}*height^{‘}*channel^{‘}=batch\ast (\frac{width+2padding-cwith}{wstride}+1)\ast (\frac{width+2padding-cheight}{hstride}+1)*cchannel$$

一般情况我们设置卷积核的高=宽=f,步长为s,卷积核数为cchannel,则公式可以简化为:

$$batch^{‘}*width^{‘}*height^{‘}*channel^{‘}=batch\ast (\frac{width+2padding-f}{stride}+1)\ast (\frac{width+2padding-f}{stride}+1)*channel$$

注意,公式计算可能出现小数,所以要向下取证。

池化:

设池化的宽与高为$pwidth$与$pheight$,步长为$wstrid$与$hstrid$

经过卷积后的图片张数:

$$batch^{‘}=batch$$

经过卷积后的宽:

$$weight^{‘}=(\frac{width+2padding-pwidth}{wstride}+1)$$

经过卷积后的高:

$$height^{‘}=(\frac{width+2padding-pheight}{hstride}+1)$$

经过卷积后的通道数:

$$channel^{‘}=channel$$

池化后的数据为:

$$batch^{‘}*width^{‘}*height^{‘}*channel^{‘}=batch\ast (\frac{width+2padding-pwidth}{wstride}+1)\ast (\frac{width+2padding-pheight}{hstride}+1)\ast channel$$

同样当我们设定池化宽=高=f,步长为stride,则公式为:

$$batch^{‘}*width^{‘}*height^{‘}*channel^{‘}=batch\ast (\frac{width+2padding-width}{wstride}+1)\ast (\frac{width+2padding-height}{stride}+1)\ast channel$$

二、tensorflow中卷积相关内容

函数介绍:

  1、卷积的实现函数:tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

  • input:输入的要做卷积的图片,要求为一个张量,shape为 [ batch, in_height, in_weight, in_channel ],其中batch为图片的数量,in_height 为图片高度,in_weight 为图片宽度,in_channel 为图片的通道数,灰度图该值为1,彩色图为3。
  • filter: 卷积核,要求也是一个张量,shape为 [ filter_height, filter_weight, in_channel, out_channels ],其中 filter_height 为卷积核高度,filter_weight 为卷积核宽度,in_channel 是图像通道数 ,和 input 的 in_channel 要保持一致,out_channel 是卷积核数量。
  • strides: 卷积时在图像每一维的步长,这是一个一维的向量,默认是[batch, height, width, channels]取决于input的data_format,一般设置[ 1, strides, strides, 1],第一位和最后一位是1。
  • padding: string类型,值为“SAME” 和 “VALID”,表示的是卷积的形式,是否考虑边界。"SAME"是考虑边界,不足的时候用0去填充周围,"VALID"则不考虑
  • use_cudnn_on_gpu: bool类型,是否使用cudnn加速,默认为true。

  这里一开始可能对input和strides传入的列表的数值设定可能不太了解为什么这么设置,这个主要有data_format决定,详情可以看一下这个博文:https://blog.csdn.net/qq_30934313/article/details/86626050

  2、池化的实现函数:tf.nn.max_pool(value, ksize, strides, padding, name=None)

  • 第一个参数value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape。
  • k_size:池化窗口的大小,取一个四维向量,shape为[batch, height, width, channels],一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1。
  • strides:窗口在每一个维度上滑动的步长,shape为[batch, height, width, channels],一般也是[1, stride,stride, 1]。
  • padding:string类型,值为“SAME” 和 “VALID”,表示的是卷积的形式,是否考虑边界。"SAME"是考虑边界,不足的时候用0去填充周围,"VALID"则不考虑。

  3、tensor数据维度设定(通常用于卷积到全连接层张量与捐局的转化):tf.reshape(tensor,shape,name=None)

  • tensor:传入的tensor类型数据。
  • shape:修改的形状,一个1*784的one-hot数据变成一个1*28*28*1的灰度图数据可以设置为[1,28,28,1],若某一个维度设置为-1表示这个维度不确定,转化会自行计算。
  • name:转化操作的名字。

三、代码示例

代码

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# 读取手写字数据
mnist_data = input_data.read_data_sets(r‘C:\Users\EDZ\.PyCharm2019.1\config\scratches\MNIST_data‘, one_hot=True)

# 设定每个批次的数据量,如果是CPU版本的tensor数据大可能会计算不出来所以设置为50
batch_size = 50

#计算批次数
n_batch = mnist_data.train.num_examples // batch_size

#定义卷积
def x_cov_W(x,W_shape,b_shape,act=None):
    ‘‘‘
    :param x: 进行卷积的tensor
    :param W_shape: 卷积核的shape
    :param b_shape: 偏置的shape
    :param act: 激活函数
    :return: 返回一个卷积计算结果
    ‘‘‘
    #定义卷积核
    initial = tf.truncated_normal(W_shape,stddev=0.1)
    W=tf.Variable(initial)
    #定义偏置
    b=tf.constant(0.1,tf.float32,shape=b_shape)
    #返回卷积的结果,这里设置步长为宽W=1,高H=1
    if act: #没有激活函数的情况
        return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding=‘SAME‘)+ b
    else:   #有激活函数的情况
        return act(tf.nn.conv2d(x,W,strides=[1,1,1,1],padding=‘SAME‘)+ b)

#定义池化,把原来的数据高与宽缩小一半
def pool(x):
    ‘‘‘
    :param x: 需要池化的tensor
    :return: 返回一个池化结果
    ‘‘‘
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding=‘SAME‘)

# 占位符号
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])

#将x的one-hot数据转为图片28*28*1的张量,-1:不确定的batch即图片数;28:高;28:宽;1:channel数。
x_image=tf.reshape(x,[-1,28,28,1])

#第一层卷积,W_shape-5:图高;5:图宽;1:channel数;16:卷积核个数;b_shape-16:偏置个数,因为有16个卷积核,输出为28*28*16的图
layer1_cov=x_cov_W(x_image,[5,5,1,16],[16],tf.nn.relu)
#第一层池化,输出为14*14*32的图
layer1_pool=pool(layer1_cov)

#第二层卷积,输出为14*14*32,的图
layer2_cov=x_cov_W(layer1_pool,[5,5,16,32],[32],tf.nn.relu)
#第二层池化输出为7*7*64,的图
layer2_pool=pool(layer2_cov)

#将第二层的输出扁平化为一个one-hot的1维向量
layer2_pool_flat=tf.reshape(layer2_pool,[-1,7*7*32])

#第三层全连接层
full3_w=tf.Variable(tf.truncated_normal([7*7*32,720],stddev=0.1)) #权重矩阵:w输入为7*7*32,输出为720
full3_b=tf.constant(0.1,tf.float32,[720])  #偏置
full3_ouput=tf.nn.relu(tf.matmul(layer2_pool_flat,full3_w)+full3_b)  #激活函数为Relu

#第四层全连接层
full4_w=tf.Variable(tf.truncated_normal([720,10],stddev=0.1)) #权重矩阵:w输入为1024,输出为10
full4_b=tf.constant(0.1,tf.float32,[10])  #偏置
full4_ouput=tf.matmul(full3_ouput,full4_w)+full4_b #为了不与后面的交叉熵损失冲突无激活函数

#定义交叉熵损失函数
cross_entropy=tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=full4_ouput)

#使用Adam梯度下降法训练模型
train=tf.train.AdamOptimizer(0.001,0.9,0.999).minimize(cross_entropy)

# 初始化
init = tf.global_variables_initializer()

# 结果存放在bool型列表汇总
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(full4_ouput, 1))

# 计算准确度,并加入到总结指令
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

with tf.Session() as sess:
    sess.run(init)

    # 训练20代
    for epoch in range(20):
        # 每代对数据进行一轮minibatch
        for batch in range(n_batch):
            batch_x, batch_y = mnist_data.train.next_batch(batch_size)  # 每个循环读取batch_size大小批次的数据
            sess.run(train, feed_dict={x: batch_x, y: batch_y})
            acc = sess.run(accuracy, feed_dict={x: mnist_data.test.images, y: mnist_data.test.labels})  # 用测试数据计算准确度
            if batch % 99 == 0:
                print(‘第%d代%d批次,准确率为%.6f‘ % (epoch + 1, batch + 1, acc))

  

原文地址:https://www.cnblogs.com/dwithy/p/11445705.html

时间: 2024-11-09 03:59:51

tensorflow框架学习 (九)—— CNN卷积神经网络的实现的相关文章

TensorFlow框架(4)之CNN卷积神经网络详解

1. 卷积神经网络 1.1 多层前馈神经网络 多层前馈神经网络是指在多层的神经网络中,每层神经元与下一层神经元完全互连,神经元之间不存在同层连接,也不存在跨层连接的情况,如图 11所示. 图 11 对于上图中隐藏层的第j个神经元的输出可以表示为: 其中,f是激活函数,bj为每个神经元的偏置. 1.2 卷积神经网络 1.2.1 网络结构 卷积神经网络与多层前馈神经网络的结构不一样,其每层神经元与下一层神经元不是全互连,而是部分连接,即每层神经层中只有部分的神经元与下一层神经元有连接,但是神经元之间

Tensorflow框架初尝试————搭建卷积神经网络做MNIST问题

Tensorflow是一个非常好用的deep learning框架 学完了cs231n,大概就可以写一个CNN做一下MNIST了 tensorflow具体原理可以参见它的官方文档 然后CNN的原理可以直接学习cs231n的课程. 另外这份代码本地跑得奇慢..估计用gpu会快很多. import loaddata import tensorflow as tf #生成指定大小符合标准差为0.1的正态分布的矩阵 def weight_variable(shape): initial = tf.tru

CNN卷积神经网络学习笔记2:网络结构

在上篇笔记<CNN卷积神经网络学习笔记1:背景介绍>中已经介绍过CNN的结构,这篇笔记中,通过一个简单的CNN的例子,梳理一下CNN的网络结构的细节. 以下是一个6层的CNN网络,这个简单的CNN网络是DeepLearning Toolbox里面CNN的一个例子,后面要通过DeepLearning Toolbox中CNN的代码来进一步理解CNN的整个过程.我们输入的是1张大小为28*28的图片. 需要注意的有: 1,这里输入的是一张图片,如果我们输入了50张图片,那么下图中的每一个方框(代表一

CNN卷积神经网络学习笔记3:权值更新公式推导

在上篇<CNN卷积神经网络学习笔记2:网络结构>中,已经介绍了CNN的网络结构的详细构成,我们已经可以初始化一个自己的CNN网络了,接下来就是要用训练得到一个确定的CNN的模型,也就是确定CNN的参数. CNN本质上就是人工神经网络的一种,只是在前几层的处理上有所不同,我们可以把卷积核看成是人工神经网络里的权值W,而采样层实质上也是一种卷积运算.所以可以基于人工神经网络的权值更新的方法来推导CNN里的权值更新公式.人工神经网络里是用反向传播算法将误差层层回传,利用梯度下降法更新每一层的权值,C

Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN

http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之:CNN卷积神经网络推导和实现 [4]Deep Learning模型之:CNN的反向求导及练习 [5]Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN [6]Deep Learn

【转】Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现

原作者:zouxy09 原文链接:http://blog.csdn.net/zouxy09/article/details/9993371 Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 [email protected] http://blog.csdn.net/zouxy09          自己平时看了一些论文,但老感觉看完过后就会慢慢的淡忘,某一天重新拾起来的时候又好像没有看过一样.所以想习惯地把一些感觉有用的论文中的知识点总结整理一下,一方面在整理过程中,自己

DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解

DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43225445 本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Convolutional Neural Networks (LeNet).经详细注释的代码和原始代码:放在我的github地址上,可下载. 一.CNN卷积神经网络原理

Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现(转)

Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 [email protected] http://blog.csdn.net/zouxy09          自己平时看了一些论文,但老感觉看完过后就会慢慢的淡忘,某一天重新拾起来的时候又好像没有看过一样.所以想习惯地把一些感觉有用的论文中的知识点总结整理一下,一方面在整理过程中,自己的理解也会更深,另一方面也方便未来自己的勘察.更好的还可以放到博客上面与大家交流.因为基础有限,所以对论文的一些理解可能不太正确,还望大家不

深度学习笔记1(卷积神经网络)

深度学习笔记1(卷积神经网络) 在看完了UFLDL教程之后,决定趁热打铁,继续深度学习的学习,主要想讲点卷积神经网络,卷积神经网络是深度学习的模型之一,还有其它如AutoEncoding.Deep Belief Network.Restricted Boltzmann Machine和sparse coding等. 在UFLDL教程中提到了针对大型图像的处理,使用卷积和池化的概念.原因主要对于全连接网络,需要的参数就有很多.比如对于一副1000*1000的图像,hidden layer也为100

[转]Theano下用CNN(卷积神经网络)做车牌中文字符OCR

Theano下用CNN(卷积神经网络)做车牌中文字符OCR 原文地址:http://m.blog.csdn.net/article/details?id=50989742 之前时间一直在看 Michael Nielsen 先生的 Deep Learning 教程. 用了他的代码在theano下测试了下中文车牌字符的识别.由于我没有GPU,简单的在进行了16个epoch之后,识别率达到了 98.41% ,由于图像本来质量就不高,达到这个识别率,效果挺不错了. 一共 31 类 车牌中文字符数据来源于