本节学习资源来自腾讯课堂《TensorFlow实战入门-手把手教你搭建线性回归模型》、《TensorFlow 深度学习应用实践》 清华大学出版社

TensorFlow计算图

TensorFlow将计算的定义与执行分开,执行运算大致有两部分:

  • 建立计算图
  • 运行计算图

计算图就是在一张图中以节点的形式将TensorFlow的操作展现出来,比如我们要表示:
Tensorflow 入门学习2 常量、变量和数据类型_tensorflow
它的计算图大致是:
Tensorflow 入门学习2 常量、变量和数据类型_tensorflow_02

建立计算图

下面定义一个简单的计算图:

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]}))

Tensorflow 入门学习2 常量、变量和数据类型_三角函数_03

一些常用的函数

操作

描述

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 Tensorflow 入门学习2 常量、变量和数据类型_三角函数_04,表示我们期望模型的输出,我们还需要定义损失函数,这里我们使用标准的线性回归模型,损失函数就使用均方误差:
Tensorflow 入门学习2 常量、变量和数据类型_tensorflow_05

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和其转置的乘积德分解

详细说明可参考:​