学习神经网络已经有一段时间,从普通的BP神经网络到LSTM长短期记忆网络都有一定的了解,但是从未系统的把整个神经网络的结构记录下来,我相信这些小记录可以帮助我更加深刻的理解神经网络。

简介

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

其主要结构分为输入层、隐含层、输出层。

在tensorboard中,其结构如图所示:

对于卷积神经网络而言,其输入层、输出层与平常的卷积神经网络无异。

但其隐含层可以分为三个部分,分别是卷积层(对输入数据进行特征提取)、池化层(特征选择和信息过滤)、全连接层(等价于传统前馈神经网络中的隐含层)。

隐含层介绍

1、卷积层

卷积将输入图像放进一组卷积滤波器,每个滤波器激活图像中的某些特征。

假设一副黑白图像为5*5的大小,像这样:

利用如下卷积器进行卷积:

卷积结果为:

卷积过程可以提取特征,卷积神经网络是根据特征来完成分类的。

在tensorflow中,卷积层的重要函数是:

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)

其中:

1、input是输入量,shape是[batch, height, width, channels]。;

2、filter是使用的卷积核;

3、strides是步长,其格式[1,step,step,1],step指的是在图像卷积的每一维的步长;

4、padding:string类型的量,只能是"SAME","VALID"其中之一,SAME表示卷积前后图像面积不变。

2、池化层

池化层用于在卷积层进行特征提取后,输出的特征图会被传递至池化层进行特征选择和信息过滤。

常见的池化是最大池化,最大池化指的是取出这些被卷积后的数据的最大值,就是取出其最大特征。

假设其池化窗口为2X2,步长为2。

原图像为:

池化后为:

在tensorflow中,池化层的重要函数是:

tf.nn.max_pool(value, ksize, strides, padding, data_format, name)

1、value:池化层的输入,一般池化层接在卷积层后面,shape是[batch, height, width, channels]。

2、ksize:池化窗口的大小,取一个四维向量,一般是[1, in_height, in_width, 1]。

3、strides:和卷积类似,窗口在每一个维度上滑动的步长,也是[1, stride,stride, 1]。

4、padding:和卷积类似,可以取’VALID’ 或者’SAME’。

这是tensorboard中卷积层和池化层的连接结构:

3、全连接层

全连接层与普通神经网络的结构相同,如图所示:

具体实现代码

卷积层、池化层与全连接层实现代码

def conv2d(x,W,step,pad): #用于进行卷积,x为输入值,w为卷积核
    return tf.nn.conv2d(x,W,strides = [1,step,step,1],padding = pad)
def max_pool_2X2(x,step,pad):	#用于池化,x为输入值,step为步数
    return tf.nn.max_pool(x,ksize = [1,2,2,1],strides= [1,step,step,1],padding = pad)
def weight_variable(shape):		#用于获得W
    initial = tf.truncated_normal(shape,stddev = 0.1) #从截断的正态分布中输出随机值
    return tf.Variable(initial)
def bias_variable(shape):		#获得bias
    initial = tf.constant(0.1,shape=shape)  #生成普通值
    return tf.Variable(initial)
def add_layer(inputs,in_size,out_size,n_layer,activation_function = None,keep_prob = 1):	
#用于添加全连接层
    layer_name = 'layer_%s'%n_layer
    with tf.name_scope(layer_name):
        with tf.name_scope("Weights"):
            Weights = tf.Variable(tf.truncated_normal([in_size,out_size],stddev = 0.1),name = "Weights")
            tf.summary.histogram(layer_name "/weights",Weights)
        with tf.name_scope("biases"):
            biases = tf.Variable(tf.zeros([1,out_size])   0.1,name = "biases")
            tf.summary.histogram(layer_name "/biases",biases)
        with tf.name_scope("Wx_plus_b"):
            Wx_plus_b = tf.matmul(inputs,Weights)   biases
            tf.summary.histogram(layer_name "/Wx_plus_b",Wx_plus_b)
        if activation_function == None :
            outputs = Wx_plus_b 
        else:
            outputs = activation_function(Wx_plus_b)
        print(activation_function)
        outputs = tf.nn.dropout(outputs,keep_prob)
        tf.summary.histogram(layer_name "/outputs",outputs)
        return outputs
def add_cnn_layer(inputs, in_z_dim, out_z_dim, n_layer, conv_step = 1, pool_step = 2, padding = "SAME"):
#用于生成卷积层和池化层
    layer_name = 'layer_%s'%n_layer
    with tf.name_scope(layer_name):
        with tf.name_scope("Weights"):
            W_conv = weight_variable([5,5,in_z_dim,out_z_dim])
        with tf.name_scope("biases"):
            b_conv = bias_variable([out_z_dim])
        with tf.name_scope("conv"):
        #卷积层
            h_conv = tf.nn.relu(conv2d(inputs, W_conv, conv_step, padding) b_conv) 
        with tf.name_scope("pooling"):
        #池化层
            h_pool = max_pool_2X2(h_conv, pool_step, padding)
    return h_pool

全部代码

import tensorflow as tf 
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data",one_hot = "true")
def conv2d(x,W,step,pad):
    return tf.nn.conv2d(x,W,strides = [1,step,step,1],padding = pad)
def max_pool_2X2(x,step,pad):
    return tf.nn.max_pool(x,ksize = [1,2,2,1],strides= [1,step,step,1],padding = pad)
def weight_variable(shape):
    initial = tf.truncated_normal(shape,stddev = 0.1) #从截断的正态分布中输出随机值
    return tf.Variable(initial)
def bias_variable(shape):
    initial = tf.constant(0.1,shape=shape)  #生成普通值
    return tf.Variable(initial)
def add_layer(inputs,in_size,out_size,n_layer,activation_function = None,keep_prob = 1):
    layer_name = 'layer_%s'%n_layer
    with tf.name_scope(layer_name):
        with tf.name_scope("Weights"):
            Weights = tf.Variable(tf.truncated_normal([in_size,out_size],stddev = 0.1),name = "Weights")
            tf.summary.histogram(layer_name "/weights",Weights)
        with tf.name_scope("biases"):
            biases = tf.Variable(tf.zeros([1,out_size])   0.1,name = "biases")
            tf.summary.histogram(layer_name "/biases",biases)
        with tf.name_scope("Wx_plus_b"):
            Wx_plus_b = tf.matmul(inputs,Weights)   biases
            tf.summary.histogram(layer_name "/Wx_plus_b",Wx_plus_b)
        if activation_function == None :
            outputs = Wx_plus_b 
        else:
            outputs = activation_function(Wx_plus_b)
        print(activation_function)
        outputs = tf.nn.dropout(outputs,keep_prob)
        tf.summary.histogram(layer_name "/outputs",outputs)
        return outputs
def add_cnn_layer(inputs, in_z_dim, out_z_dim, n_layer, conv_step = 1, pool_step = 2, padding = "SAME"):
    layer_name = 'layer_%s'%n_layer
    with tf.name_scope(layer_name):
        with tf.name_scope("Weights"):
            W_conv = weight_variable([5,5,in_z_dim,out_z_dim])
        with tf.name_scope("biases"):
            b_conv = bias_variable([out_z_dim])
        with tf.name_scope("conv"):
            h_conv = tf.nn.relu(conv2d(inputs, W_conv, conv_step, padding) b_conv) 
        with tf.name_scope("pooling"):
            h_pool = max_pool_2X2(h_conv, pool_step, padding)
    return h_pool
def compute_accuracy(x_data,y_data):
    global prediction
    y_pre = sess.run(prediction,feed_dict={xs:x_data,keep_prob:1})
    correct_prediction = tf.equal(tf.arg_max(y_data,1),tf.arg_max(y_pre,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
    result = sess.run(accuracy,feed_dict = {xs:batch_xs,ys:batch_ys,keep_prob:1})
    return result
keep_prob = tf.placeholder(tf.float32)
xs = tf.placeholder(tf.float32,[None,784])
ys = tf.placeholder(tf.float32,[None,10])
x_image = tf.reshape(xs,[-1,28,28,1])
h_pool1 = add_cnn_layer(x_image, in_z_dim = 1, out_z_dim = 32, n_layer = "cnn1",)
h_pool2 = add_cnn_layer(h_pool1, in_z_dim = 32, out_z_dim = 64, n_layer = "cnn2",)
h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64])
h_fc1_drop = add_layer(h_pool2_flat, 7*7*64, 1024, "layer1", activation_function = tf.nn.relu, keep_prob = keep_prob)
prediction = add_layer(h_fc1_drop, 1024, 10, "layer2", activation_function = tf.nn.softmax, keep_prob = 1)
with tf.name_scope("loss"):
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=ys,logits = prediction),name = 'loss')
    tf.summary.scalar("loss",loss)
train = tf.train.AdamOptimizer(1e-4).minimize(loss)
init = tf.initialize_all_variables()
merged = tf.summary.merge_all()
with tf.Session() as sess:
    sess.run(init)
    write = tf.summary.FileWriter("logs/",sess.graph)
    for i in range(5000):
        batch_xs,batch_ys = mnist.train.next_batch(100)
        sess.run(train,feed_dict = {xs:batch_xs,ys:batch_ys,keep_prob:0.5})
        if i % 100 == 0:
            print(compute_accuracy(mnist.test.images,mnist.test.labels))

以上就是python人工智能tensorflow构建卷积神经网络CNN的详细内容,更多关于tensorflow构建卷积神经网络CNN的资料请关注Devmax其它相关文章!

python人工智能tensorflow构建卷积神经网络CNN的更多相关文章

  1. ios – 如何在iPhone应用程序中集成SIRI?

    我正在开发一款iPad应用程序.我想在其中集成SIRI功能.所以,请指导我研究这个问题.其实我不知道如何开始.谢谢,CP解决方法直到现在苹果还没有发布siri的api用于第三方应用程序.如果您正在寻找文本到语音,语音到文本功能.有很多外部api像:>Nuance–Dragon>ispeech>OpenEars还有很多其他的api.OpenEars是一个开源离线api,另外两个是付费和在线的.

  2. android – 是否有任何Google Now API可以将我们自己的应用程序集成到现在?

    如何向Google即时提供我的应用数据的信息或卡片?解决方法Google即时API仅适用于向Google注册其应用的用户,它是私有的.谷歌控制哪些卡将在他们的谷歌即时应用程序上显示.因此,您需要与Google联系并注册您的应用以获取NowAPI,然后您可以构建自己的Now卡.

  3. 如何在Android平台上使用Tensorflow?

    谷歌为开发者提供了TENSORFLOW开源软件.有什么方法可以在Android上使用它吗?

  4. 直接在Android NDK端使用tensorflow(不使用JAVA api)

    如何在Android上使用Capis构建和链接tensorflow库.你能指导我吗?

  5. 是否有可能在Android上训练tensorflow?

    似乎没有CAPI来训练张量流图并保存到pb.so,在Android平台上有什么办法吗?我可以在Android设备上使用pythonAPI构建tensorflow工作区吗?

  6. android – 与auth.extendSSOAccessToken相关的Facebook错误

    我在我的应用程序中使用FacebookSDK3.0forAndroid在人们的墙上发布更新.在我的facebook的Insights区域,它表示我的API调用中约有25%导致API错误.在“最常见的API错误”下,它表示auth.extendSSOAccesstoken.在“API错误细分”下,它表示没有API错误.我唯一一次看到Facebook开发者网站中引用的auth.extendSSOAcc

  7. 错误:android工作室项目中不存在com.facebook.android包

    我是androidstudio的新手.我正在开发一个使用FacebookSDK的应用程序.我已经下载了FacebbokSDK并将其作为模块导入到我的android项目中.我正在使用最新版本的androidstudio.so我只是导入它并没有为此更改其他文件.首先我尝试使用facebook登录功能.但是当我构建应用程序时,我收到以下错误.我可以看到一个解决方案作为某人问题的答案.但我无法理解.请有人帮助我.解决方法检查你build.gradle它应该有这种依赖性如果你有图书馆项目:如果你在libs文件夹中有

  8. Android语音识别API离线

    有人可以帮帮我吗?我正在通过RecognizerIntent开发具有语音识别功能的应用程序.>哪个Android版本通过API正式提供了对应用的离线识别?>通过我读到的知识,如果通过在线服务或离线字典完成语音识别,那么开发者就不会选择它.我对吗?或者有没有记录的API设置离线?谢谢解决方法现在有离线语音识别是可能的android4.1.检查这篇文章article并检查pochetsphinx

  9. 在电话中更改语音android

    我想制作一个Android应用程序,允许用户在通话期间更改语音.例如:你是一个男人,在通过电话交谈的时候,你可以将声音变成一个女人或者机器人.这就像一个有趣的恶作剧.我在安卓的API和谷歌工作了几天,但仍然不知道.有人告诉是不可能的,但我看到一些谷歌播放的应用可以做到:https://play.google.com/store/apps/details?id=com.gridmob.android

  10. python深度学习tensorflow1.0参数和特征提取

    这篇文章主要为大家介绍了python深度学习tensorflow1.0参数和特征提取,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部