Tensorflow入门-实现神经网络

学习tensorflow一段时间了,感觉非常的好用,在使用时,有时候最重要的是想好神经网络的结构,这样就可以随意的在神经网络中加如隐含层了,特别主要的是矩阵的维度相乘的问题,下面将使用tensorflow实现神经网络,做一下自己的理解.

实现无隐含层的神经网络

下面以手写数字识别的例子作为说明.

读入数据

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(‘MNIST_data/‘,one_hot=True)

查看数据情况:

分为训练数据,验证数据和测试数据三类.

print mnist.train.images.shape
print mnist.train.labels.shape
print mnist.test.images.shape
print mnist.test.labels.shape
print mnist.validation.images.shape
print mnist.validation.labels.shape
######################
##这里有55000*784,784为每一个图片的维度,被拉成一个长的向量
(55000, 784)
(55000, 10)
(10000, 784)
(10000, 10)
(5000, 784)
(5000, 10)

这里注意一下,输入训练的x为 n*784 ,w 为 784*10 输出的y为: n*10,即每一个行向量有10个列,表示了其代表0,1…9的概率值.

x = tf.placeholder(tf.float32,[None,784])其表示,在进行run的时候才读入数据.

y = tf.nn.softmax(tf.matmul(x,W)+b) softmax为转出每个标签的概率,表示预测的结果.其公式为:

softmaxi=exp(xi)∑jexp(xj)

可以看到,只不过对输出做了一个概率上的统计而已.

预测作为了,我们还需要一个损失函数,传递误差,所用的损失函数为交叉熵损失:

H=?∑y?log(y′)

其中y为真实的值,y’为预测的值

注意reduce_sum的使用:

图片来源:知乎

reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))

所以此语句的意思是将每一个样本的损失加起来,然后在用reduce_mean()求平均.因为y,y’都为1*10的向量,这是要注意的.

接下来就是要定义训练的方式,采用梯度下降,来最小话交叉熵.

tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

sess = tf.InteractiveSession()
#real data
x = tf.placeholder(tf.float32,[None,784])
y_ = tf.placeholder(tf.float32,[None,10])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
#predict
y = tf.nn.softmax(tf.matmul(x,W)+b)
#loss
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))
#train ways
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

进行训练

##重点,全局参数初始化
tf.global_variables_initializer().run()
##迭代1000次,每次取出100个样本进行训练SGD
for i in range(1000):
    batch_x,batch_y = mnist.train.next_batch(100)
    train_step.run({x:batch_x,y_:batch_y})

train_step.run({x:batch_x,y_:batch_y})这种方式为在运行的时候,feed_dict给x,y_的值,其中x为训练样本,y_为对应的真值.

评估

#test
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))       #高维度的
acuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))    #要用reduce_mean
print acuracy.eval({x:mnist.test.images,y_:mnist.test.labels})

最终的结果为:0.9174

实现多层神经网络

为了方便的添加层,写一个添加层的函数,其中in_size,out_size都为神经元的尺度,input为上一层的输出,output为这一层的输出.

完整代码如下:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
sess = tf.InteractiveSession()

#定义添加隐含层的函数
def add_layer(inputs, in_size, out_size,keep_prob=1.0,activation_function=None):
    Weights = tf.Variable(tf.truncated_normal([in_size,out_size],stddev=0.1))
    biases = tf.Variable(tf.zeros([out_size]))
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
        outputs = tf.nn.dropout(outputs,keep_prob)  #随机失活
    return outputs

# holder变量
x = tf.placeholder(tf.float32,[None,784])
y_ = tf.placeholder(tf.float32,[None,10])
keep_prob = tf.placeholder(tf.float32)     # 概率

h1 = add_layer(x,784,300,keep_prob,tf.nn.relu)
##输出层
w = tf.Variable(tf.zeros([300,10]))     #300*10
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(h1,w)+b)

#定义loss,optimizer
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y),reduction_indices=[1]))
train_step  =tf.train.AdagradOptimizer(0.35).minimize(cross_entropy)

correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))       #高维度的
acuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))    #要用reduce_mean

tf.global_variables_initializer().run()
for i in range(3000):
    batch_x,batch_y  = mnist.train.next_batch(100)
    train_step.run({x:batch_x,y_:batch_y,keep_prob:0.75})
    if i%1000==0:
        train_accuracy = acuracy.eval({x:batch_x,y_:batch_y,keep_prob:1.0})
        print("step %d,train_accuracy %g"%(i,train_accuracy))

###########test

print acuracy.eval({x:mnist.test.images,y_:mnist.test.labels,keep_prob:1.0})

运行上述程序,得到正确为:0.9784,而这仅仅是加了一个隐含层而已.

上面的隐含层的节点加的是300个神经元,如果要再加上一层400个神经元的非常的简单.

h1 = add_layer(x,784,300,keep_prob,tf.nn.relu)
h2 = add_layer(h1,300,400,keep_prob,tf.nn.relu)
##输出层
w = tf.Variable(tf.zeros([400,10]))     #300*10
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(h2,w)+b)

可以看到,你可以随意的添加隐含的节点,和节点的个数,需要注意的是,维度不要搞错就行了.

参考资料:

  1. https://github.com/tensorflow/tensorflow
  2. tensorflow实战
时间: 04-16

Tensorflow入门-实现神经网络的相关文章

tensorflow入门教程

1. LSTM 大学之道,在明明德的博客: (译)理解 LSTM 网络 (Understanding LSTM Networks by colah) TensorFlow入门(五)多层 LSTM 通俗易懂版 TensorFlow入门(三)多层 CNNs 实现 mnist分类 另一个博客,写的代码很好: TensorFlow 实现多层 LSTM 的 MNIST 分类 + 可视化 博客:写的很好 用tensorflow搭建RNN(LSTM)进行MNIST 手写数字辨识 博客: Tensorflow

OpenCV+TensorFlow入门人工智能图像处理视频教程 共9章

第1章 课程导学包括课程概述.课程安排.学习前提等方面的介绍,让同学们对计算机视觉有所理解 第2章 计算机视觉入门通过OpenCV以及TensorFlow两个方面介绍计算机入门的相关知识.OpenCV侧重点在于为大家补充图像处理的相关基础,如像素.文件封装格式.灰度等级.颜色通道等的概念.TensorFlow重点在于通过对常量.变量.矩阵等的介绍,学习并掌握TensorFlow的基本使用.... 第3章 计算机视觉加强之几何变换本章节主要为大家介绍图像的几何变换.几何变换顾名思义就是对图片外形轮

TensorFlow 入门之手写识别(MNIST) softmax算法

TensorFlow 入门之手写识别(MNIST) softmax算法 MNIST 卢富毓 softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算法 我们知道MNIST的每一张图片都表示一个数字,从0到9.我们希望得到给定图片代表每个数字的概率.比如说,我们的模型可能推测一张包含9的图片代表数字9的概率是80%但是判断它是8的概率是5%(因为8和9都有上半部分的小圆),然后给予它代表其他数字的概率更小的值. 这是一个使用softmax回归(sof

转:TensorFlow入门(六) 双端 LSTM 实现序列标注(分词)

http://blog.csdn.net/Jerr__y/article/details/70471066 欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @creat_date: 2017-04-19 前言 本例子主要介绍如何使用 TensorFlow 来一步一步构建双端 LSTM 网络(听名字就感觉好腻害的样子),并完成序列标注的问题.先声明一下,本文中采用的方法主要参考了[中文分词系列] 4. 基于双向LSTM的seq2seq字标注这篇文章.该文章用

TensorFlow实战-TensorFlow实现卷积神经网络CNN-第5章

第5章-TensorFlow实现卷积神经网络CNN 5.1 卷积神经网络简介 卷积神经网络CNN最初是为了解决图像识别等问题设计的,当然现在的应用已经不限于图像和视频,也可以用于时间序列信号,比如音频信号.文本数据等. 在深度学习出现之前,必须借助SIFT.HoG等算法提取出有效而丰富的特征,再集合SVM等机器学习算法进行图像识别. CNN作为一个深度学习架构被提出来最初的诉求是降低对图像数据预处理的要求,以及避免复杂的特征工程.CNN最大的特点是在于卷积的权值共享结构,可以大幅减少神经网络的参

统计学习方法:罗杰斯特回归及Tensorflow入门

作者:桂. 时间:2017-04-21  21:11:23 链接:http://www.cnblogs.com/xingshansi/p/6743780.html 前言 看到最近大家都在用Tensorflow,一查才发现火的不行.想着入门看一看,Tensorflow使用手册第一篇是基于MNIST的手写数字识别的,用到softmax regression,而这个恰好与我正在看的<统计信号处理>相关.本文借此梳理一下: 1)罗杰斯特回归 2)Softmax Regression 3)基于Tenso

tensorflow入门 (一)

转载:作者:地球的外星人君链接:https://www.zhihu.com/question/49909565/answer/207609620来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 分享一篇文章面向普通开发者的机器学习入门,作者@狸小华 前言 最近在摸索这方面相关的知识,本着整理巩固,分享促进的精神.所以有了这篇博文. 需要注意的是,本文受众:对机器学习感兴趣,且愿意花点时间学习的应用(业务)程序员 我本意是尽量简单,易于理解,快速上手,短时间能跑出来东

基于tensorflow搭建一个神经网络

一,tensorflow的简介 Tensorflow是一个采用数据流图,用于数值计算的 开源软件库.节点在图中表示数字操作,图中的线 则表示在节点间相互联系的多维数据数组,即张量 它灵活的架构让你可以在多种平台上展开计算,例 如台式计算机中的一个或多个CPU(或GPU), 服务器,移动设备等等.Tensorflow最初由Google 大脑小组的研究员和工程师们开发出来,用于机器 学习和深度神经网络方面的研究,但这个系统的通 用性使其也可广泛用于其他计算领域. 二,tensorflow的架构 Te

OpenCV+TensorFlow 入门人工智能图像处理

第1章 课程导学包括课程概述.课程安排.学习前提等方面的介绍,让同学们对计算机视觉有所理解1-1 计算机视觉导学 第2章 计算机视觉入门通过OpenCV以及TensorFlow两个方面介绍计算机入门的相关知识.OpenCV侧重点在于为大家补充图像处理的相关基础,如像素.文件封装格式.灰度等级.颜色通道等的概念.TensorFlow重点在于通过对常量.变量.矩阵等的介绍,学习并掌握TensorFlow的基本使用....2-1 本章介绍2-2 Mac下一站式开发环境anaconda搭建2-3 Win