神经网络,机器学习,可以说是现在最流行的计算机技术,TensorFlow是谷歌开源的机器学习框架,听起来就很高大上,很难学习,不幸的是国内的一些教程都是原文翻译谷歌官方教程,非常难以学习,所以本系列教程就是用比较容易懂的语言来教大家什么tensorflow。 首先tensorflow是一个深度学习的框架,其定义了一套神经网络机制,是用户可以在这套神经网络上开发自己的深度学习模型,进行机器学习。 说的通俗一点tensorflow就是一套神经网络的编程框架,和java中的各种框架一个概念,只是他是用来开发深度学习的框架。其正真复杂的东西是如何在这套框架的基础上设计深度学习的模型,比如现在的CNN卷积神经网络,RNN循环神经网络,这都是深度学习模型,都是基于神经网络开发出来的模型。 所以大家学习的时候,不应该把tensorflow看做是多么高大上的东西,而把他看做一种深度学习的编程框架,这样更容易学习,而真正高大上的是那些包含了很多数学知识的模型。这套教程我们就用简单易懂的语言来介绍tensorflow。课程中所有的示例代码都是基于python3,和tensorflow 1.1 下面我们来介绍一下几个基本的概念
- 唯一的数据表达结构tensor:tensorflow中只有一种数据结构tensor表达数据,tensor的中文意思是张量,不懂的要去复习一下高等数学,线性代数。也就是说tensorflow的作用就是来对tensor来进行处理的,而不是传统的int,float,double数据类型,当然tensor中的元素的数据类型则可以是int,float等,不管你做什么处理,都要构造成tensor才能被tensorflow所处理,即使是一个简单整形数字
- 变量:tensorflow中也有变量就如同我们传统编程中使用的变量一样,他是通过tf.Variable来定义的,其在使用过程中是可以被修改的,经常会被用做需要训练得出的结果,比如 y=wx+b,我们给定一组y,和x,我们希望神经网络能够学习其中的规律,得出w,和b应该是多少,这时候我们一般就 会把w,和b定义成变量,让神经网络不断的纠正w,和b
W=tf.Variable([.3],tf.float32)
b=tf.Variable([-.3],tf.float32)
x=tf.placeholder(tf.float32)
linear_model=W*x+b
- 常量:tensorflow中的常量是用tf.constant来定义的,顾名思义常量定义后是不可以修改的,和我们传统开发语言中的常量是一样的概念
node1 = tf.constant(3.0, tf.float32) # create a constant
node2 = tf.constant(4.0)
如上我们声明了两个常量,在使用过程中就不能再被修改了
- placeholder:就是tensorflow中的输入参数,可以在使用过程中重新赋值
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
- optimizer:tensorflow学习的过程,就是把实际的结果和神经网络计算出来的结果做比较,使得计算结果不断的逼近实际的结果,这其中就涉及到一个优化器的概念,每次计算完以后都用优化器来来优化,不断逼近,其本质上就是按照某种算法不断的调整参数,如上面讲到的例子y=wx+b,就是不断的修正w和b,这就是训练的过程。
下面我就用前面介绍的概念来设计一个简单的机器学习模型,有助于大家根据直观的理解 第一个机器学习的tensorflow代码 如下这段代码是一个完整的机器学习过程,这段代码在给定x=[1,2,3,4]情况下y=[0,-1,-2,-3],让机器学习y= Wx + b的方程中W和b应该是多少。
import tensorflow as tf
import numpy as np
sess = tf.Session()#初始化一个session,tensorflow中所有的运算都是通过session来实现的
W=tf.Variable([.3],tf.float32)#声明W变量
b=tf.Variable([-.3],tf.float32)#声明b变量
x=tf.placeholder(tf.float32)#声明x作为输入参数,在训练的时候可以给定训练值
linear_model=W*x+b#声明回归模型y=Wx+b
init=tf.global_variables_initializer()#初始化所有变量
y=tf.placeholder(tf.float32)#声明y作为输入产生,在训练的时候可以给定训练值
squared_deltas=tf.square(linear_model-y)#计算程序计算的值和实际值的差异
loss=tf.reduce_sum(squared_deltas)#累积误差
optimizar =tf.train.GradientDescentOptimizer(0.01)#定义优化器
train=optimizar.minimize(loss)#设定优化器是使误差越来越小
sess.run(init)#初始化
for i in range(1000):#训练1000次
sess.run(train,{x:[1,2,3,4],y:[0,-1,-2,-3]})
if i%20==0:#每训练20次,打印这时候的W和b
print(i,sess.run(W),sess.run(b))
执行这段训练模型会得到如下的输出:
0 [-0.21999997] [-0.456]
20 [-0.58761531] [-0.21246126]
40 [-0.67591733] [ 0.04715736]
60 [-0.74531162] [ 0.25118509]
80 [-0.79984683] [ 0.41152528]
100 [-0.84270465] [ 0.53753263]
120 [-0.87638563] [ 0.63655871]
140 [-0.90285456] [ 0.71438056]
160 [-0.92365587] [ 0.77553892]
180 [-0.94000298] [ 0.82360154]
200 [-0.95284992] [ 0.86137295]
220 [-0.96294594] [ 0.89105648]
240 [-0.97088015] [ 0.91438407]
260 [-0.97711545] [ 0.93271655]
280 [-0.98201561] [ 0.94712371]
300 [-0.98586655] [ 0.95844597]
320 [-0.98889291] [ 0.96734387]
340 [-0.99127126] [ 0.97433633]
360 [-0.99314034] [ 0.97983164]
380 [-0.99460912] [ 0.98415017]
400 [-0.99576342] [ 0.98754394]
420 [-0.9966706] [ 0.99021119]
440 [-0.99738348] [ 0.99230719]
460 [-0.99794376] [ 0.99395436]
480 [-0.99838412] [ 0.99524909]
500 [-0.99873012] [ 0.99626648]
520 [-0.99900204] [ 0.99706584]
540 [-0.99921572] [ 0.99769413]
560 [-0.99938363] [ 0.9981879]
580 [-0.99951565] [ 0.99857605]
600 [-0.99961936] [ 0.99888098]
620 [-0.9997009] [ 0.99912065]
640 [-0.99976492] [ 0.99930882]
660 [-0.99981529] [ 0.99945682]
680 [-0.9998548] [ 0.99957311]
700 [-0.99988592] [ 0.9996646]
720 [-0.9999103] [ 0.99973637]
740 [-0.99992955] [ 0.99979281]
760 [-0.99994463] [ 0.99983722]
780 [-0.99995649] [ 0.99987203]
800 [-0.99996579] [ 0.99989945]
820 [-0.99997312] [ 0.9999209]
840 [-0.99997884] [ 0.99993783]
860 [-0.99998337] [ 0.99995112]
880 [-0.99998695] [ 0.99996156]
900 [-0.99998969] [ 0.99996972]
920 [-0.99999189] [ 0.99997616]
940 [-0.99999362] [ 0.99998128]
960 [-0.99999499] [ 0.99998528]
980 [-0.99999613] [ 0.99998856]
从输出的结果可以看出,整个训练就是一个不断逼近的过程,当最后训练完的时候,W和b已经非常逼近实际的值了,精度是非常高的。 这段代码虽然是非常简单的一段机器学习的代码,但实际上所有的机器学习都遵循这样一个过程。 示例程序请关注http://www.diegorobot.com