本节学习资源来自腾讯课堂《TensorFlow实战入门-手把手教你搭建线性回归模型》、《TensorFlow 深度学习应用实践》 清华大学出版社
TensorFlow计算图
TensorFlow将计算的定义与执行分开,执行运算大致有两部分:
- 建立计算图
- 运行计算图
计算图就是在一张图中以节点的形式将TensorFlow的操作展现出来,比如我们要表示:
它的计算图大致是:
建立计算图
下面定义一个简单的计算图:
node1 = tf.constant(3.0,dtype=tf.float32)
node2 = tf.constant(4.0) # also tf.float32 implicitly
print(node1,node2)
输出:
Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
执行计算图
sess = tf.Session()
print(sess.run([node1,node2]))
下面定义一个较复杂一点的计算图,两个节点相加
import tensorflow as tf
node3 = tf.add(node1,node2)
sess = tf.Session()
print("node3:",node3)
print("sess.run(node3):",sess.run(node3))
输出:
node3: Tensor("Add_3:0", shape=(), dtype=float32)
sess.run(node3): 7.0
TensorFlow用张量来表示所有数据,一个张量有一个静态类型和动态类型的维数,张量可以在图中的节点之间流通。
基于特殊的数据和处理方式,TensorFlow中数据类型也会随之改变,常规的数据并不适合TensorFlow框架的使用。TensorFlow本身定义了一套特殊的函数,能够根据需要将不同的量设置成所需要的形式。
常量定义示例
import tensorflow as tf
input1 = tf.constant(1)
print(input1)
input2 = tf.Variable(2,tf.int32)
print(input2)
input2 = input1
sess = tf.Session()
print(sess.run(input2))
placeholder
占位符。因为TensorFlow特殊的数据计算和处理形式,图进行计算时,可以从外界传入数值。而TensorFlow并不能直接对传入的数据进行处理,因此使用placeholder保留一个数据的位置,之后可以在TensorFlow会话进行的时候进行赋值。
import tensorflow as tf
input1 = tf.placeholder(tf.int32)
input2 = tf.placeholder(tf.int32)
output = tf.add(input1,input2)
sess = tf.Session()
print(sess.run(output,feed_dict={input1:[1],input2:[2]}))
variable
tf.Variable ,在执行过程中可以不断调整模型内部的参数,改进模型表现。
示例:
import tensorflow as tf
W = tf.Variable([0.3],dtype=tf.float32)
b = tf.Variable([-.3],dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b
init = tf.global_variables_initializer() # 初始化variable
sess = tf.Session()
sess.run(init)
print(sess.run(linear_model,{x:[1,2,3,4]}))
一些常用的函数
操作 | 描述 |
tf.add(x,y,name=None) | 求和 |
tf.sub(x,y,name=None) | 减法 |
tf.mul(x,y,name=None) | 乘法 |
tf.div(x,y,name=None) | 除法 |
tf.mod(x,y,name=None) | 取模 |
tf.abs(x,name=None) | 求绝对值 |
tf.neg(x,name=None) | 取负(y=-x) |
tf.sign(x,name=None) | 返回符号 |
tf.inv(x,name=None) | 取反 |
tf.square(x,name=None) | 平方 |
tf.sqrt(x,name=None | 开方 |
tf.exp(x,name=None | 计算e的次方 |
tf.log(x,name=None) | 计算log |
tf.maximum(x,y,name=None) | 返回最大值(x>y?x:y) |
tf.minimum(x,y,name=None) | 返回最小值 |
tf.cos(x,name=None) | 三角函数cosine |
tf.sin(x,name=None) | 三角函数sin |
tf.tan(x,name=None) | 三角函数tan |
tf.atan(x,name=None) | 三角函数ctan |
损失函数
上面已经定义了一个模型,但是还无法判断模型的好坏,现在定义另一个placeholder ,表示我们期望模型的输出,我们还需要定义损失函数,这里我们使用标准的线性回归模型,损失函数就使用均方误差:
import tensorflow as tf
W = tf.Variable([0.3],dtype=tf.float32)
b = tf.Variable([-.3],dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b
y = tf.placeholder(tf.float32)
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_mean(squared_deltas) # 均方误差
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
print(sess.run(loss,{x:[1,2,3,4],y:[0,-1,-2,-3]}))
输出:
5.915
variable的值可以通过tf.assign赋值。
tf.train
TensorFlow 中 tf.train API提供了多种用于模型训练的类和函数,包括各种常见优化算法,梯度计算,梯度剪裁等。
optimizer会对模型的变量进行调整,最终使得损失函数的值尽可能的小。最简单的optimizer就是梯度下降。在后面章节会有相关代码示例。
TensorFlow 矩阵运算
TensorFlow 中矩阵的生成与计算是所有结构计算中最为重要和复杂的。
创建一个张量矩阵
import tensorflow as tf
a = tf.constant([1,2,3],shape=[2,3])
print(a)
sess = tf.Session()
print(sess.run(a))
这行代码创建了一个2行3列的矩阵。
[[1 2 3]
[3 3 3]]
随机生成矩阵张量使用下面的函数:
import tensorflow as tf
a = tf.random_normal (shape=[2,3],mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)
print(a)
sess = tf.Session()
print(sess.run(a))
或使用:
- tf.truncated_normal
- tf.random_uniform
TensorFlow 中几种常用的矩阵函数:
tf.diag(diagonal,name=Nonw) 生成对角矩阵
tf.diag(diagonal,name=None)
tf.trace(x,name=None) #求一个2维Tensor足迹,即为对角值diagonal之和
tf.transpose(a,perm=None,name=‘transpose’) #调换tensor的维度顺序,按照列表perm的维度排列调换tensor的顺序
tf.matmul(a,b,transpose_a=False,transpose_b=False,a_is_sparse=False,b_is_sparse=False,name=None) #矩阵相乘
tf.matrix_determinant(input,name=None) #计算行列式
tf.matrix_inverse(input,adjoint=None,name=None) 转置
tf.cholesky(input,name=None) #对输入方阵cholesky分解,即为将一个对称正定矩阵表示成一个下三角矩阵L和其转置的乘积德分解
详细说明可参考: