TensorFlow初学
基本概念
1.激活函数和成本函数
激活函数(activation function):一般是非线性函数,就是每个神经元通过这个函数将原有的来自其他神经的输入做一个非线性变化,输出给下一层神经元。激活函数实现的非线性能力是前向传播很重要的一部分。
成本函数(cost function):损失值越小,结果越可靠。
2.有监督学习和无监督学习
有监督学习:训练数据有标记的学习。
无监督学习:有两种思路:一种是聚类,另一种是在成功时采用某种形式的激励制度,即强化学习。
此外还有半监督学习,其训练数据有一部分有标记,有一部分没有,有标记数据的标记不是确定的。
3.TensorFlow
TensorFlow支持卷积神经网络CNN和循环神经网络RNN,以及RNN的一个特例长短期记忆网络LSTM.
(1)环境配置(略)
(2)运行示例
import tensorflow as tf
hello=tf.constant('Hello')
sess=tf.Session()
print( sess.run(hello) )`
sess=tf.Session()
a=tf.constant(10)
b=tf.constant(22)
print(sess.run(a+b))
(3)可视化TensorFlow(略)
(4)TensorFlow基础知识
TensorFlow的编程理念
编程模式通常分为命令式编程和符号式编程。
符号式编程一般是先定义各种变量,然后建立一个数据流图,在数据流图中规定各个变量之间的计算关系,最后需要对数据流图进行编译,但此时的数据流图还是一个空壳,里面没有任何实际数据,只有把需要运算的输入放进去后,才能使整个模型中形成数据流,从而形成输出值。
如以下定义了一个操作,但是实际上并没有运行:
import tensorflow as tf
t=tf.add(8,9)
print(t)
Tensor("Add:0", shape=(), dtype=int32)
import tensorflow as tf
#创建图
a=tf.constant([1.0,2.0])
b=tf.constant([3.0,4.0])
c=a*b
#创建会话
sess=tf.Session()
#计算c
print(sess.run(c))
sess.close()
[ 3. 8.]
TensorFlow的编程模型
(具体可以参考https://www.sogou.com/link?url=DOb0bgH2eKh1ibpaMGjuy9T9X2Sf41yxhqGP_cUGwmZUu-0gQ4GHCibc-iPH6wf8pQcrxo3DZGxbd4MaiShHcg..)
下图讲述了其运行原理。图中包括输入(input)、塑形(reshape)、Relu层(隐藏层)、Logit层(输出层)、Softmax(计算输出结果中各个类别的概率分布)、交叉熵(cross entropy,度量两个概率分布,即原样本的概率分布和输出结果的概率分布之间的相似性)、梯度(gradient)、SGD训练(SGD Trainer,反向传播过程,依次更新,即bsm,Wsm,bh1,Wh1)等部分,是一个简单的回归模型。(code实现:https://blog.csdn.net/blwinner/article/details/81252344)
TensorFlow是指张量的流动,其数据流图是由节点(node)和边(edge)组成的有向无环图(directed acycline graph,DAG).
TensorFlow由tensor和flow两部分组成,tensor代表了数据流图中的边,而flow代表了数据流图中节点所做的操作。
- 边
TensoFlow的边有两种连接关系:数据依赖和控制依赖。其中实线边表示数据依赖,代表数据,即张量。任意维度的数据统称为张量。在机器学习算法中,张量在数据流图中从前往后流动一遍就完成了一次前向传播,而残差从后向前流动一次就完成了一次反向传播。
还有一种特殊的边,一般为虚线边,称为控制依赖,用于控制操作的运行,来确保happens-before关系,这类边上没有数据流过,但是源节点必须在目的节点开始执行前完成执行。
执行代码:tf.Graph.control_dependencies(control_inputs)
- 节点
图中的节点又称为算子,它代表一个操作(option,OP),一般用来表示施加的数学运算,也可以表示数据输入(feed in)的起点以及输出(push out)的终点,或者是I/O持久变量的终点。
算子支持表:
- 图
把操作任务描述成有向无环图。构建图的第一步是创建各个节点:
#创建一个常量运算操作,产生一个1*2矩阵
matrix1=tf.constant([[3.,3.]])
#创建另外一个常量运算操作,产生一个2*1矩阵
matrix2=tf.constant([[2.],[2.]])
#创建一个矩阵乘法运算,把matrix1和matrix2作为输入
#返回值product代表矩阵乘法的结果
product=tf.matmul(matrix1,matrix2)
print(product)
- 会话
启动图的第一步是创建一个Session对象。
在调用Session对象的run()方法来执行图时,传入一些tensor,这个过程叫做填充(feed),返回的结果类型根据输入的类型而定,这个过程叫取回(fetch).
会话主要有两个API接口:Extend和Run。Extend操作是在Graph中添加节点和边,Run操作是输入计算的节点和填充必要的数据后,进行运算并输出运算结果。
- 设备
GPU、CPU.
TensorFlow可以明确指定操作在哪个设备上执行:
with tf.Session() as sess:
#指定在第二个gpu上运行
with tf.device("/gpu:1"):
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.], [2.]])
product = tf.matmul(matrix1, matrix2)
- 变量
变量是一种特殊的数据,在图中有固定的位置。
创建一个变量张量,使用tf.Variable()构造函数,这个构造函数需要一个初始值,初始值的形状和类型决定了这个变量的形状和类型:
#创建一个变量,初始化变量为标量0
state=tf.Variable(0,name="counter")
#创建一个常量张量
input1=tf.constant(3.0)
TensorFlow还提供了填充机制,可以在构建图时使用tf.placeholder()临时替代任意操作的张量,在调用Session对象的run()方法去执行图时,使用填充数据作为调用的参数,调用结束后,填充数据就消失。
input1=tf.placeholder(tf.float32)
input2=tf.placeholder(tf.float32)
output=tf.mul(input1,input2)
with tf.Session() as sess:
print(sess.run([output],feed_dict={input1:[7.],input2:[2.]}))
- 内核
TF中还有一个概念是kernel,kernel是operation在某种设备上的具体实现。TF的库通过注册机制来定义op和kernel,所以可以通过链接一个其他的库来进行kernel和op的扩展。