卷积神经网络CNN理论到实践(5)

来源:互联网 发布:mac系统终端命令 编辑:程序博客网 时间:2024/06/05 02:31

  • 导读
  • LeNet5
  • 一个简单CNN的实现
  • 用CNN做mnist手写识别
  • welcome

1. 导读

前面我们用了4篇博文,详细介绍了CNN的基本理论。从这一篇开始,我们将逐渐走向实战。在本篇博文中,我们首先下来介绍一下,最经典的CNN网络,LeNet5。可以说,它是很多现代CNN的雏形。即便是现在,使用这个模型也可以处理一大批基本问题。我们会先从原理上,做一个介绍,然后使用python进行编程实现。如果有精力,再用它做个试验。

2. LeNet5

3. 一个简单CNN的实现

接下来我们来实现一个简单的CNN,CNN结构如图所示:

这里写图片描述
图3.1:本文将要实现的CNN结构
(作图很辛苦,打赏需谨慎)

#!/usr/bin/env python# @Time    : 6/5/17 6:48 PM# @Author  : SunXiangguo# @version : Anaconda3.6+Ubuntu_16.04_STL_64# @File    : cnn1.py# @Software: PyCharmfrom tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tfmnist = input_data.read_data_sets("MNIST_data/",one_hot=True)sess = tf.InteractiveSession()def weight_variable(shape):    initial = tf.truncated_normal(shape,stddev=0.1)    return tf.Variable(initial)def bias_variavle(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_2x2(x):    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_image = tf.reshape(x,[-1,28,28,1])W_conv1 = weight_variable([5,5,1,32])b_conv1 = bias_variavle([32])h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1) + b_conv1)h_pool1 = max_pool_2x2(h_conv1)W_conv2 = weight_variable([5,5,32,64])b_conv2 = bias_variavle([64])h_conv2 = tf.nn.relu(conv2d(h_pool1,W_conv2) + b_conv2)h_pool2 = max_pool_2x2(h_conv2)W_fc1 = weight_variable([7*7*64,1024])  # 'fc'means 'full connected'b_fc1 = bias_variavle([1024])h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64])h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)

4.用CNN做mnist手写识别

#!/usr/bin/env python# @Time    : 6/5/17 6:48 PM# @Author  : SunXiangguo# @version : Anaconda3.6+Ubuntu_16.04_STL_64# @File    : cnn1.py# @Software: PyCharmfrom tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tfmnist = input_data.read_data_sets("MNIST_data/",one_hot=True)sess = tf.InteractiveSession()def weight_variable(shape):    initial = tf.truncated_normal(shape,stddev=0.1)    return tf.Variable(initial)def bias_variavle(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_2x2(x):    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_image = tf.reshape(x,[-1,28,28,1])W_conv1 = weight_variable([5,5,1,32])b_conv1 = bias_variavle([32])h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1) + b_conv1)h_pool1 = max_pool_2x2(h_conv1)W_conv2 = weight_variable([5,5,32,64])b_conv2 = bias_variavle([64])h_conv2 = tf.nn.relu(conv2d(h_pool1,W_conv2) + b_conv2)h_pool2 = max_pool_2x2(h_conv2)W_fc1 = weight_variable([7*7*64,1024])  # 'fc'means 'full connected'b_fc1 = bias_variavle([1024])h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64])h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)# Dropout layerkeep_prob = tf.placeholder(tf.float32)h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob)W_fc2 = weight_variable([1024,10])  # 0~9,there are 10 classesb_fc2 = bias_variavle([10])y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)# training targetcross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y_conv),reduction_indices=[1]))train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)# precisioncorrect_prediction = tf.equal(tf.argmax(y_conv,1),tf.argmax(y_,1))accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))# start trainingtf.global_variables_initializer().run()for i in range(20000):    batch = mnist.train.next_batch(50)    if i%100 == 0:        train_accuracy = accuracy.eval(feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0})        print("step {0},training accuracy {1}".format(i,train_accuracy))    train_step.run(feed_dict = {x:batch[0],y_:batch[1],keep_prob:0.5})# start predictprint("test accuracy {0}".format(accuracy.eval(feed_dict={    x:mnist.test.images,y_:mnist.test.labels,keep_prob:1.0})))

代码结果:

这里写图片描述

可以看到,如此简单的一个CNN,就已经可以达到非常高的性能了。


《卷积神经网络CNN理论到实践(6)》


welcome!

Xiangguo Sun
sunxiangguodut@qq.com
http://blog.csdn.net/github_36326955

Welcome to my blog column: Dive into ML/DL!

这里写图片描述

I devote myself to dive into typical algorithms on machine learning and deep learning, especially the application in the area of computational personality.

My research interests include computational personality, user portrait, online social network, computational society, and ML/DL. In fact you can find the internal connection between these concepts:

这里写图片描述

In this blog column, I will introduce some typical algorithms about machine learning and deep learning used in OSNs(Online Social Networks), which means we will include NLP, networks community, information diffusion,and individual recommendation system. Apparently, our ultimate target is to dive into user portrait , especially the issues on your personality analysis.


All essays are created by myself, and copyright will be reserved by me. You can use them for non-commercical intention and if you are so kind to donate me, you can scan the QR code below. All donation will be used to the library of charity for children in Lhasa.


赏金将用于拉萨儿童图书公益募捐
社会公益,听IT人的声音

手机扫一扫,即可:

附:《春天里,我们的拉萨儿童图书馆,需要大家的帮助

阅读全文
0 0