tensorflow入门
参考文章:
https://blog.csdn.net/jdbc/article/details/68957085
一、对于tensorflow背景的了解
TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从图象的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。
Tensoflow是目前最火爆的深度学习框架,其他的深度学习框架有keras、pytorch、caffe、theano等。
tensor即张量的意思,flow是流。顾名思义就是张量在流动,后面了解了框架之后这个名字就非常好理解。
二、基本概念
首先必须知道tensorflow是基于数据流图(即graph)进行计算的。
编写tensorflow程序基本的流程:
(1)通过基础变量以及它们之间的操作定义一个graph
(2)通过sess(会话)去执行graph中的操作
假设我们有这样一个需要计算的表达式。该表达式包括了两个加法与一个乘法,为了更好讲述引入中间变量c与d。由此该表达式可以表示为e = c * d = ( a+b ) * ( b+1 )
当需要计算e时就需要计算c与d,而计算c就需要计算a与b,计算d需要计算b。这样就形成了依赖关系。这种有向无环图就叫做计算图,因为对于图中的每一个节点其微分都很容易得出,因此应用链式法则求得一个复杂的表达式的导数就成为可能,所以它会应用在类似tensorflow这种需要应用反向传播算法的框架中。
图中每一个结点就是operation,结点之间的边便是tensor
Graph仅仅定义了所有 operation 与 tensor 流向,没有进行任何计算(这一点很重要,只有session才会真正地执行操作,在后面的代码中会有体现)。而session根据 graph 的定义分配资源,计算 operation,得出结果。既然是图就会有点与边,在图计算中 operation 就是点而 tensor 就是边。Operation 可以是加减乘除等数学运算,也可以是各种各样的优化算法。 tensor 就是其输入与输出,其可以表示一维二维多维向量或者常量。而且除了Variables指向的 tensor 外所有的 tensor 在流入下一个节点后都不再保存。
三、基本数据结构
(1)常量
使用tf.constant来定义。值得一提的是constant保存在graph中,如果graph重复载入那么constant也会重复载入,其非常浪费资源,如非必要尽量不使用其保存大量数据
(2)变量
使用tf.variable定义,在定义之后一定要记得初始化,初始化可以使用global_variables_initializer对所有的变量初始化
import tensorflow as tf
state = tf.Variable(0,name='test')
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(sess.run(state))
注意:tf.Variable和global_variables_initializer只是定义了这个变量,真正的执行初始化操作的是
see.run(init)
(3)placeholder
假设我们一开始不知道某个变量的值,但是却需要使用它,在后面再给它进行赋值,比如模型的输入数据,其只有在训练与预测时才会有值,那该怎么办呢?我们可以使用tf.placeholder来定义某个变量。
import tensorflow as tf
input1 = tf.placeholder(tf.float32) #大多数情况下tensorflow使用的都是32位浮点数
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1,input2)
with tf.Session() as sess:
result=sess.run(output,feed_dict={input1:[7.],input2:[2.]})
print(result)
placeholder一般和feed_dict结合使用,feed_dict即是在之后为placeholder赋值。
采用字典的键值对方式,比如上述代码中input1在feed_dict中定义为7,input2为2
sess.run()时用到了哪个placeholder就把其放入后面的feed_dict中。
(4)session
session是tensorflow中至关重要的部分。所有操作在定义时均未被执行,只有在sess.run()时才真正被执行。
定义session有两种方式:
①
import tensorflow as tf
sess = tf.Session() # 一定要打括号,一开始写总忘记。。
sess.run()
# 执行完只要的操作后关闭
sess.close()
②实际上使用python的with语句更加方便也更加安全,并且不用手动关闭session
执行完相应操作后它会自动关闭session
import tensorflow as tf
with tf.Session() as sess: # don't need to close sess
result = sess.run()
四、其他零碎知识
1、tensorflow中的张量的shape如果是四维的话,那么各维度含义如下:
[batch,height,width,channel]
第一维是batch(数据处理的批次),二维是高,三维宽,四维颜色通道
2、会话也有交互式的形式
sess = tf.InteractiveSession()
它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的。这对于工作在交互式环境中的人们来说非常便利。
最后贴上一个最基础的神经网络的结构的tensorflow代码:
import tensorflow as tf
import numpy as np
# create data
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data*0.1+0.3 # 实际权重为0.1,偏置为0.3
## crete tensorflow start ##
Weights = tf.Variable(tf.random_uniform([1],-1.0,1.0))
biases = tf.Variable(tf.zeros([1]))
y = Weights*x_data + biases # 预测值
loss = tf.reduce_mean(tf.square(y - y_data)) #误差
optimizer = tf.train.GradientDescentOptimizer(0.5) # 神经网络梯度下降优化器,参数为learning rate
#使用优化器使得误差最小
train = optimizer.minimize(loss)
init = tf.initialize_all_variables()
## crete tensorflow end ##
sess = tf.Session()
sess.run(init) # **init操作,very important
for step in range(201): # 训练201步
sess.run(train)
if step % 20 ==0: # 每隔20步输出权重和参数以及误差
print(step,sess.run(Weights),sess.run(biases),sess.run(loss))
结果:
从结果中可看出,随着训练的步数增加,我们的weight和bias是越来越接近0.1和0.3的,也就是我们实际设置的y=0.1x+0.3,loss是越来越小的。代表模型的确起了作用。