神经网络-tensorflow实现mnist手写数字识别

原创 2017年05月16日 16:47:11

optimizer = tf.train.AdamOptimizer().minimize(cost)	

今天将进行第一次实战,带大家体验机器学习界的“hello word”,mnist手写数字识别系统的实现。博主机器近期不知道发了什么疯,windows下的tensorflow再次无法运行,无奈之下只得屈服- -,用虚拟机装载linux系统,在linux系统下执行,具体安装方法很简单,详情见官方文档

https://www.tensorflow.org/versions/r0.12/get_started/index.html

这里不多做赘述。


第一次使用linux系统,按照教程下载了subline进行代码编写。


根据之前的神经网络介绍,下面开始吧~我将详述每行代码的作用,方便大家理解。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
minist = input_data.read_data_sets("/tmp/data/",one_hot = True)

首先,加载我们的rensorflow库,库里面已经自带了mnist的数据,将数据下载并存入minist变量中(这里我不小心拼错了,懒得改了,见谅- -!)


这里one_hot表示独热编码,即一位有效编码,例如本次实验的输出为0-9十个数,分别表示为:

0 = [1,0,0,0,0,0,0,0,0,0]

1 = [0,1,0,0,0,0,0,0,0,0]

2 = [0,0,1,0,0,0,0,0,0,0]

。。。


读取完了数据,我们需要设置参数,这样写的好处就是方便调整网络参数,分别定义出各个各个隐藏层的神经元个数。https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1490606666358&di=68475c8073ee304bae93ccd7488471cd&imgtype=0&src=http%3A%2F%2Fwww.36dsj.com%2Fwp-content%2Fuploads%2F2016%2F06%2F1182.jpg

继续上我们这个老图,我们需要设置两个变量,一个权重weight,一个偏置biases

hidden_1layer = {'weights':tf.Variable(tf.random_normal([784,n_nodes_hdl1])),'biases':tf.Variable(tf.random_normal([n_nodes_hdl1]))}
定义隐藏层1有两个变量,分别取随机矩阵,维度行为前一层的输出个数,列为本层的输出个数,即神经元个数


设置有3个隐藏层,外加一个输出层,输出层代码如下:

output_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hdl3,n_classes])),'biases':tf.Variable(tf.random_normal([n_classes]))}
随机矩阵中行为第三个隐藏层的输出个数,列为总输出个数,这里n_class为10 即(0-9个数)


申明完了变量,接下来需要申明算法,由于python语言计算比较慢,直接用python计算需要消耗很多时间,利用tensorflow定义完计算方式通过c++来完成计算。


算法很简单,如上图所示,active_function(input * weight + biases) = output


这里激励函数选择relu函数


l2 = tf.add(tf.matmul(l1,hidden_2layer['weights']) , hidden_2layer['biases'])
l2 = tf.nn.relu(l2)

输出层计算代码如下

output = tf.matmul(l3,output_layer['weights']) + output_layer['biases']
第三个隐藏层的输出*输出层权重加上输出层偏置,返回最终输出


这是一个神经网络正向传递过程,接下来误差反向传递


用交叉熵函数定义代价函数,来表示输出与实际label的差别

softmax_cross_entropy_with_logits 这个函数把softmax与交叉熵函数结合在一起,softmax函数的作用相当于把每个输出量化为一个概率,这里返回一个向量,需要求均值得出实际输出与期望输出的损失。

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(prediction,y))

之前博客中提到,为了使损失降到最小反向更新权重以及偏置,这里tensorflow已经有很多最优化函数,这里选择AdamOptimizer()

optimizer = tf.train.AdamOptimizer().minimize(cost)	

全部定义完毕后,将训练数据分离,将变量,代价函数,最优控制器放入session中执行即可。

结果如下


总共执行

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
minist = input_data.read_data_sets("/tmp/data/",one_hot = True) #one_hot means put the input data transfor '0' or '1'

'''
input > weight >hidden layer 1 (activation function) > weights > hidden l 2..
cross entropy(how not fit of the moddel)
optimization function to minmize the cost

BP NN
'''
# 10 class ,0-9

'''
one_hot means
0 = [1,0,0,0,0,0,0,0,0,0]
1 = [0,1,0,0,0,0,0,0,0,0]
'''
# first build the number of neural
n_nodes_hdl1 = 500
n_nodes_hdl2 = 500
n_nodes_hdl3 = 500
#each hidden layer has 500 neural nodes
n_classes = 10
batch_size = 100 #to fit the weight about 100 times ???

x = tf.placeholder('float')#placeholder to define the pre-input data ,just give the type and shape,the 2nd paremeter is to leave something thire
y = tf.placeholder('float')

def neural_network_model(data):
	hidden_1layer = {'weights':tf.Variable(tf.random_normal([784,n_nodes_hdl1])),'biases':tf.Variable(tf.random_normal([n_nodes_hdl1]))}
	hidden_2layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hdl1,n_nodes_hdl2])),'biases':tf.Variable(tf.random_normal([n_nodes_hdl2]))}
	hidden_3layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hdl2,n_nodes_hdl3])),'biases':tf.Variable(tf.random_normal([n_nodes_hdl3]))}
	output_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hdl3,n_classes])),'biases':tf.Variable(tf.random_normal([n_classes]))}
	l1 = tf.add(tf.matmul(data,hidden_1layer['weights']) , hidden_1layer['biases'])
	l1 = tf.nn.relu(l1) #active function reli function

	l2 = tf.add(tf.matmul(l1,hidden_2layer['weights']) , hidden_2layer['biases'])
	l2 = tf.nn.relu(l2)

	l3 = tf.add(tf.matmul(l2,hidden_3layer['weights']) , hidden_3layer['biases'])
	l3 = tf.nn.relu(l3)

	output = tf.matmul(l3,output_layer['weights']) + output_layer['biases']

	return output


def train_neural_network(x):
	prediction = neural_network_model(x)
	cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(prediction,y))

	optimizer = tf.train.AdamOptimizer().minimize(cost)	

	hm_epochs = 10

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

		for epoch in range(hm_epochs):
			epoch_loss = 0
			for _ in range(int(minist.train.num_examples/batch_size)):
				epoch_x,epoch_y = minist.train.next_batch(batch_size)
				_,c = sess.run([optimizer,cost], feed_dict = {x: epoch_x,y: epoch_y})
				epoch_loss += c
			print('Epoch',epoch,'completed out of',hm_epochs,'loss',epoch_loss)
		correct = tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))

		accuracy = tf.reduce_mean(tf.cast(correct,'float'))
		print('accuracy',accuracy.eval({x:minist.test.images, y:minist.test.labels}))
train_neural_network(x)		


短短70行就能实现一个手写数字识别系统,可见python的强大!





Python神经网络代码识别手写字的实现流程(一):加载mnist数据

任何的神经网络代码,加载数据都是第一步.加载数据的流程其实就是给神将网络的输入层输入数据的流程. (1)首先介绍python中的gzip模块:gzip模块就是将压缩的数据解压,然后返回一个文件对象....
  • yuyushikuan
  • yuyushikuan
  • 2017年11月03日 11:28
  • 209

Python 神经网络实现MNIST分类

784*50*10 层级 遇到个问题,训练样本调整到3000的时候,计算出现了nan。待解决。 # -*- coding: utf-8 -*- """ Created on Fri...
  • a14206149
  • a14206149
  • 2016年03月12日 14:44
  • 1663

python 实现识别手写 MNIST数字集的程序

python 实现识别手写 MNIST 数字集的程序 我们需要做的第⼀件事情是获取 MNIST 数据。如果你是⼀个 git ⽤⼾,那么你能够 通过克隆这本书的代码仓库获得数据,  实现我们的⽹络来分类...
  • chen_shiqiang
  • chen_shiqiang
  • 2016年07月14日 21:53
  • 13248

识别MNIST数据集之(二):用Python实现神经网络

Python NeuralNetwork MNIST
  • superCally
  • superCally
  • 2017年01月10日 12:18
  • 4160

bp神经网络实现mnist数据库手写体数字识别

  • 2015年02月13日 10:54
  • 16KB
  • 下载

深度学习第三天: LeNet在Python实现Mnist手写数字.md

学习网址备份 http://wiki.swarma.net/index.php?title=%E5%88%A9%E7%94%A8python%E7%9A%84theano%E5%BA%93%E5%88...
  • cq361106306
  • cq361106306
  • 2016年09月06日 16:10
  • 1193

识别MNIST数据集:用Python实现神经网络

识别MNIST数据集之(二):用Python实现神经网络
  • jacke121
  • jacke121
  • 2017年08月22日 00:12
  • 286

TensorFlow学习_02_CNN卷积神经网络_Mnist手写数字识别

github地址:https://github.com/lawlite19/MachineLearning_TensorFlow 或者上一篇Tensorflow的博客:http://blog.csdn...
  • u013082989
  • u013082989
  • 2016年12月16日 16:54
  • 2808

基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型

一、卷积神经网络模型知识要点卷积卷积 1、卷积 2、池化 3、全连接 4、梯度下降法 5、softmax 本次就是用最简单的方法给大家讲解这些概念,因为具体的各种论文网上都有,连推...
  • wlmnzf
  • wlmnzf
  • 2016年03月28日 00:46
  • 11964

深度学习笔记——TensorFlow学习笔记(三)使用TensorFlow实现的神经网络进行MNIST手写体数字识别

本文是TensorFlow学习的第三部分,参考的是《TensorFlow实战Google深度学习框架》一书,这部分讲述的是使用TensorFlow实现的神经网络进行MNIST手写体数字识别一个实例。 ...
  • mpk_no1
  • mpk_no1
  • 2017年06月04日 00:20
  • 1751
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:神经网络-tensorflow实现mnist手写数字识别
举报原因:
原因补充:

(最多只允许输入30个字)