TensorFlow构建神经网络(CNN , Mnist数据集)

一. 卷积神经网络(CNN)

1.卷积神经网络概念

2.卷积神经网络过程讲解

3.代码实现

一.卷积神经网络简介:

  • 来历:

        Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出卷积神经网络。

  • 优点:

        CNN能够得出原始图像的有效表征,这使得CNN能够直接从原始像素中,经过极少的预处理,识别视觉上面的规律。      

  • 适用领域:

        语音识别,图像识别等多个领域。

  • 结构分类:

        特征提取层(卷积),特征映射层(池化)

1.卷积神经网路结构:

2.卷积神经网络-卷积层

卷积的目的是为了从输入图像中提取特征。

卷积可以从输入的一小块数据中学到图像的特征,并保留像素间的空间关系。

3.卷积神经网络-激活函数

RuLU是一个元素级的操作(应用到各个像素),并将特征图中的所有小于0的像素值设置为零。ReLU的目的是在ConvNet中引入非线性

4.卷积神经网络-池化层

降低了各个特征图的维度,但可以保持大部分重要的信息。空间池化有下面几种方式:最大化,平均化,加和等等。

5.卷积神经网络-全连接层

使用图像的特征把输入图像基于训练数据集进行分类。

6.卷积神经网络-Mnist训练步骤(可视化):

3D网址:http://scs.ryerson.ca/~aharley/vis/conv/

二.代码部分

1.卷积神经网络-训练目标

2.代码实现

# -*- coding:utf-8 -*-
import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("data/",one_hot=True)

#训练集的image
x = tf.placeholder(tf.float32,[None,784])

#训练集的Label
y_actual = tf.placeholder(tf.float32,[None,10])

#定义一个函数,用于初始化所有的权值w
def weight_variable(shape):
    initial = tf.truncated_normal(shape,stddev=0.1)
    return tf.Variable(initial)

#定义一个函数,用于初始化所有的偏置项b
def bias_variable(shape):
    initial = tf.constant(0.1,shape=shape)
    return tf.Variable(initial)

#定义一个函数,用于构建卷积层
def conv2d(x,w):
    return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME')

#定义一个函数,用于构建池化层
def max_pool(x):
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

x_image = tf.reshape(x,[-1,28,28,1])

#构建网络
w_conv1 = weight_variable([5,5,1,32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image,w_conv1) + b_conv1)#第一个卷积层
h_pool1 = max_pool(h_conv1)#第一个池化层

w_conv2 = weight_variable([5,5,32,64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1,w_conv2) + b_conv2)#第二个卷积层
h_pool2 = max_pool(h_conv2)#第二个池化层

w_fc1 = weight_variable([7*7*64,1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64])#reshape成向量
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,w_fc1) + b_fc1)#全连接

keep_prob = tf.placeholder("float")
h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob)#dropout层

w_fc2 = weight_variable([1024,10])#第二层全连接
b_fc2 = bias_variable([10])
y_predict = tf.nn.softmax(tf.matmul(h_fc1_drop,w_fc2) + b_fc2)#softmax层

cross_entropy = -tf.reduce_sum(y_actual*tf.log(y_predict))#交叉熵
train_step = tf.train.GradientDescentOptimizer(1e-3).minimize(cross_entropy)#梯度下降法
correct_prediction = tf.equal(tf.argmax(y_predict,1),tf.argmax(y_actual,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))#精确度计算

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for i in range(20000):
        batch = mnist.train.next_batch(50)
        if i % 1000 == 0:#训练1000次验证1次
            train_acc = accuracy.eval(feed_dict={x:batch[0],y_actual:batch[1],keep_prob:1.0})
            print('step',i,'training accuracy',train_acc)
        train_step.run(feed_dict={x:batch[0],y_actual:batch[1],keep_prob:0.5})
    test_acc = accuracy.eval(feed_dict={x:mnist.test.images,y_actual:mnist.test.labels,keep_prob:1.0})
    print("test accuracy",test_acc)

猜你喜欢

转载自blog.csdn.net/qq_40108803/article/details/83148895