神经网络-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的强大!





相关文章推荐

深度学习与人脸识别系列(3)__基于VGGNet的人脸识别系统

作者:wjmishuai 出处:  声明:版权所有,转载请联系作者并注明出处 1.引言 本文中介绍的人脸识别系统是基于这两篇论文: 《Very deep convolutional netwo...

使用Tensorflow和MNIST识别自己手写的数字

最近在学习神经网络相关的东西,发现有很多资料是Tensorflow教程上的内容,但是教程很多只是一个验证官方程序的过程。如何将官方程序变成自己可以利用的程序,网上似乎资料比较少,所以我就来介绍一下如何...

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

一、卷积神经网络模型知识要点卷积卷积 1、卷积 2、池化 3、全连接 4、梯度下降法 5、softmax 本次就是用最简单的方法给大家讲解这些概念,因为具体的各种论文网上都有,连推导都有,所以本文主...

CNN实现MNIST手写数字识别

关键词:CNN、TensorFlow、卷积、池化、特征图 一. 前言本文用TensorFlow实现了CNN(卷积神经网络)的经典结构LeNet-5, 具体CNN的LeNet-5模型原理见《深度学习(四...

读书笔记-神经网络与深度学习(一)-使用神经网络识别手写数字

目录如下 1、感知器 2、S型神经元 3、神经网络的架构 4、一个简单的分类手写数字的网络 5、使用梯度下降算法进行学习 6、实现我们的网络来分类数字 7、迈向深度学习 1、...

使用神经网络识别手写数字

人类的视觉系统是世上的一个奇迹。考虑以下这串手写的数字: 大部分人都能轻易地识别出图上的数字是504192。这个看似简单的过程的背后,实际上很复杂。在我们大脑的每个脑半球中,有一个叫做初级视皮层(p...

Deep Learning-TensorFlow (1) CNN卷积神经网络_MNIST手写数字识别代码实现详解

import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data import...

用Tensorflow搭建CNN卷积神经网络,实现MNIST手写数字识别

写在前面的话不同于Tensorflow官方教程简略的DEMO,我们自己动手实现以下目标 - 从本地文件系统中加载图片、标签 - 对图片和标签预处理 - 创建batch对象以提供随机批次训练 -...

Deep Learning-TensorFlow (1) CNN卷积神经网络_MNIST手写数字识别代码实现

Deep Learning-TensorFlow之CNN卷积神经网络_MNIST手写数字识别实现

利用tensorflow一步一步实现基于MNIST 数据集进行手写数字识别的神经网络,逻辑回归

MNIST from scratch MNIST从无到有   This notebook walks through an example oftraining a TensorFlow mod...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:神经网络-tensorflow实现mnist手写数字识别
举报原因:
原因补充:

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