python人工智能tensorflow构建卷积神经网络CNN

目录
  • 简介
  • 隐含层介绍
    • 1、卷积层
    • 2、池化层
    • 3、全连接层
  • 具体实现代码
    • 卷积层、池化层与全连接层实现代码
  • 全部代码

学习神经网络已经有一段时间,从普通的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的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解tensorflow训练自己的数据集实现CNN图像分类

    利用卷积神经网络训练图像数据分为以下几个步骤 1.读取图片文件 2.产生用于训练的批次 3.定义训练的模型(包括初始化参数,卷积.池化层等参数.网络) 4.训练 1 读取图片文件 def get_files(filename): class_train = [] label_train = [] for train_class in os.listdir(filename): for pic in os.listdir(filename+train_class): class_train.app

  • tensorflow 1.0用CNN进行图像分类

    tensorflow升级到1.0之后,增加了一些高级模块: 如tf.layers, tf.metrics, 和tf.losses,使得代码稍微有些简化. 任务:花卉分类 版本:tensorflow 1.0 数据:flower-photos 花总共有五类,分别放在5个文件夹下. 闲话不多说,直接上代码,希望大家能看懂:) 复制代码 # -*- coding: utf-8 -*- from skimage import io,transform import glob import os impor

  • TensorFlow深度学习之卷积神经网络CNN

    一.卷积神经网络的概述 卷积神经网络(ConvolutionalNeural Network,CNN)最初是为解决图像识别等问题设计的,CNN现在的应用已经不限于图像和视频,也可用于时间序列信号,比如音频信号和文本数据等.CNN作为一个深度学习架构被提出的最初诉求是降低对图像数据预处理的要求,避免复杂的特征工程.在卷积神经网络中,第一个卷积层会直接接受图像像素级的输入,每一层卷积(滤波器)都会提取数据中最有效的特征,这种方法可以提取到图像中最基础的特征,而后再进行组合和抽象形成更高阶的特征,因此

  • TensorFlow实现卷积神经网络CNN

    一.卷积神经网络CNN简介 卷积神经网络(ConvolutionalNeuralNetwork,CNN)最初是为解决图像识别等问题设计的,CNN现在的应用已经不限于图像和视频,也可用于时间序列信号,比如音频信号和文本数据等.CNN作为一个深度学习架构被提出的最初诉求是降低对图像数据预处理的要求,避免复杂的特征工程.在卷积神经网络中,第一个卷积层会直接接受图像像素级的输入,每一层卷积(滤波器)都会提取数据中最有效的特征,这种方法可以提取到图像中最基础的特征,而后再进行组合和抽象形成更高阶的特征,因

  • 用tensorflow搭建CNN的方法

    CNN(Convolutional Neural Networks) 卷积神经网络简单讲就是把一个图片的数据传递给CNN,原涂层是由RGB组成,然后CNN把它的厚度加厚,长宽变小,每做一层都这样被拉长,最后形成一个分类器 在 CNN 中有几个重要的概念: stride padding pooling stride,就是每跨多少步抽取信息.每一块抽取一部分信息,长宽就缩减,但是厚度增加.抽取的各个小块儿,再把它们合并起来,就变成一个压缩后的立方体. padding,抽取的方式有两种,一种是抽取后的

  • 基于TensorFlow的CNN实现Mnist手写数字识别

    本文实例为大家分享了基于TensorFlow的CNN实现Mnist手写数字识别的具体代码,供大家参考,具体内容如下 一.CNN模型结构 输入层:Mnist数据集(28*28) 第一层卷积:感受视野5*5,步长为1,卷积核:32个 第一层池化:池化视野2*2,步长为2 第二层卷积:感受视野5*5,步长为1,卷积核:64个 第二层池化:池化视野2*2,步长为2 全连接层:设置1024个神经元 输出层:0~9十个数字类别 二.代码实现 import tensorflow as tf #Tensorfl

  • python人工智能tensorflow构建卷积神经网络CNN

    目录 简介 隐含层介绍 1.卷积层 2.池化层 3.全连接层 具体实现代码 卷积层.池化层与全连接层实现代码 全部代码 学习神经网络已经有一段时间,从普通的BP神经网络到LSTM长短期记忆网络都有一定的了解,但是从未系统的把整个神经网络的结构记录下来,我相信这些小记录可以帮助我更加深刻的理解神经网络. 简介 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),

  • python人工智能tensorflow构建循环神经网络RNN

    目录 学习前言 RNN简介 tensorflow中RNN的相关函数 tf.nn.rnn_cell.BasicLSTMCell tf.nn.dynamic_rnn 全部代码 学习前言 在前一段时间已经完成了卷积神经网络的复习,现在要对循环神经网络的结构进行更深层次的明确. RNN简介 RNN 是当前发展非常火热的神经网络中的一种,它擅长对序列数据进行处理. 什么是序列数据呢?举个例子. 现在假设有四个字,“我” “去” “吃” “饭”.我们可以对它们进行任意的排列组合. “我去吃饭”,表示的就是我

  • tensorflow构建BP神经网络的方法

    之前的一篇博客专门介绍了神经网络的搭建,是在python环境下基于numpy搭建的,之前的numpy版两层神经网络,不能支持增加神经网络的层数.最近看了一个介绍tensorflow的视频,介绍了关于tensorflow的构建神经网络的方法,特此记录. tensorflow的构建封装的更加完善,可以任意加入中间层,只要注意好维度即可,不过numpy版的神经网络代码经过适当地改动也可以做到这一点,这里最重要的思想就是层的模型的分离. import tensorflow as tf import nu

  • Tensorflow实现卷积神经网络用于人脸关键点识别

    今年来人工智能的概念越来越火,AlphaGo以4:1击败李世石更是起到推波助澜的作用.作为一个开挖掘机的菜鸟,深深感到不学习一下deep learning早晚要被淘汰. 既然要开始学,当然是搭一个深度神经网络跑几个数据集感受一下作为入门最直观了.自己写代码实现的话debug的过程和运行效率都会很忧伤,我也不知道怎么调用GPU- 所以还是站在巨人的肩膀上,用现成的框架吧.粗略了解一下,现在比较知名的有caffe.mxnet.tensorflow等等.选哪个呢?对我来说选择的标准就两个,第一要容易安

  • Tensorflow实现卷积神经网络的详细代码

    本文实例为大家分享了Tensorflow实现卷积神经网络的具体代码,供大家参考,具体内容如下 1.概述 定义: 卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现.它包括卷积层(alternating convolutional layer)和池层(pooling layer). 卷积层(convolutional layer): 对输入数据应用若干过滤器,一个输入参数被

  • TensorFlow keras卷积神经网络 添加L2正则化方式

    我就废话不多说了,大家还是直接看代码吧! model = keras.models.Sequential([ #卷积层1 keras.layers.Conv2D(32,kernel_size=5,strides=1,padding="same",data_format="channels_last",activation=tf.nn.relu,kernel_regularizer=keras.regularizers.l2(0.01)), #池化层1 keras.l

  • python人工智能tensorflow函数tensorboard使用方法

    目录 tensorboard相关函数及其常用参数设置 1 with tf.name_scope(layer_name): 2 tf.summary.histogram(layer_name+"/biases",biases) 3 tf.summary.scalar(“loss”,loss) 4 tf.summary.merge_all() 5 tf.summary.FileWriter(“logs/”,sess.graph) 6 write.add_summary(result,i)

  • python人工智能tensorflow常用激活函数Activation Functions

    目录 常见的激活函数种类及其图像 1 sigmoid(logsig)函数 2 tanh函数 3 relu函数 4 softplus函数 tensorflow中损失函数的表达 1 sigmoid(logsig)函数 2 tanh函数 3 relu函数 4 softplus函数 激活函数在机器学习中常常用在神经网络隐含层节点与神经网络的输出层节点上,激活函数的作用是赋予神经网络更多的非线性因素,如果不用激励函数,输出都是输入的线性组合,这种情况与最原始的感知机相当,网络的逼近能力相当有限.如果能够引

随机推荐