Tensorflow的基本操作

这一篇博文我们集中梳理了Tensorflow常用的基础操作与对应的函数,熟练掌握这些操作可以为后续使用Tensorflow构建深度神经网络扫清障碍。

数据操作

算术运算

函数 描述
tf.assign(x, y, name=None) 令x=y
tf.add(x, y, name=None) 求和
tf.subtract(x, y, name=None) 相减
tf.multiply(x, y, name=None) 相乘
tf.divide(x, y, name=None) 相除
tf.mod(x, y, name=None) 取模
tf.abs(x, name=None) 求绝对值
tf.negative(x, name=None) 取负
tf.sign(x, name=None) 返回x的符号,x>0返回1,x<0返回-1,x=0返回0
tf.reciprocal(x, name=None) 求倒数
tf.square(x, name=None) 求平方
tf.round(x, name=None) 舍入最接近的整数
tf.sqrt(x, name=None) 求平方根
tf.pow(x, y, name=None) 求x的y次幂
tf.exp(x, name=None) 求e的x次幂
tf.log(x, name=None) 求x的对数
tf.maximum(x, y, name=None) 返回x和y中的较大值
tf.minimum(x, y, name=None) 返回x和y中的较小值
tf.cos(x, name=None) 求余弦值
tf.sin(x, name=None) 求正弦值
tf.tan(x, name=None) 求正切值
tf.atan(x, name=None) 求反正切值
tf.cond(pred, true_fn=None, false_fn=None, strict=False, name=None, fn1=None, fn2=None) 满足条件就执行true_fn,否则执行false_fn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import tensorflow as tf
# 参与算数运算的变量类型必须一致(都设为float)
x = tf.Variable(tf.constant(0.0), dtype=tf.float32)
y = tf.Variable(tf.constant(2.0), dtype=tf.float32)

with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print(sess.run(x))
sess.run(tf.assign(x, 10)) # assign的对象必须是Variable创建的
print(sess.run(x))
sums = tf.add(x, 5) # 加和
diff = tf.subtract(x, 5) # 相减
prod = tf.multiply(x, y) # 相乘
div = tf.divide(x, y) # 相除
mod = tf.mod(x, y) # 取模
absv = tf.abs(x) # 取绝对值
neg = tf.negative(y) # 取负
sign = tf.sign(x) # 取符号
inv = tf.reciprocal(x) # 取倒数
sqr = tf.square(y) # 求平方
rnd = tf.round(0.9) # 舍入最接近的整数
power = tf.pow(y, 3) # 求幂次方
exp = tf.exp(y) # e的幂次方
log = tf.log(x) # 求log
maxi = tf.maximum(x, y) # 返回二者较大的
mini = tf.minimum(x, y) # 返回二者较小的
cos = tf.cos(x) # 求余弦值
sin = tf.sin(x) # 求正弦值
tan = tf.tan(x) # 求正切值
cot = tf.atan(x) # 求反正切值

def f1(): return tf.add(x, 1)
def f2(): return tf.multiply(y, 3)
cond = tf.cond(tf.less(x, y), f1, f2) # 条件执行

result = sess.run([sums, diff, prod, div, mod, absv, neg, sign, inv, sqr, rnd, power, exp, \
log, maxi, mini, cos, sin, tan, cot, cond])
print("x+5={ret[0]}, x-5={ret[1]}, x*y={ret[2]}, x/y={ret[3]}, x%y={ret[4]},\n \
|x|={ret[5]}, -y={ret[6]}, the sign of x is {ret[7]}, 1/x={ret[8]}, y**2={ret[9]}, 0.9->{ret[10]},\n \
y**3={ret[11]}, e**y={ret[12]}, log(x)={ret[13]}, max(x,y)={ret[14]}, min(x,y)={ret[15]},\n \
cos(x)={ret[16]}, sin(x)={ret[17]}, tan(x)={ret[18]}, cot(x)={ret[19]},\n \
if x < y: x + 1 else: y*3 -> {ret[20]}".format(
ret=result))

矩阵运算

函数 描述
tf.diag(diagonal, name=None) 返回一个给定对角值的对角矩阵
tf.diag_part(input, name=None) 返回给定矩阵的对角值
tf.trace(x, name=None) 返回矩阵的迹(标量)
tf.transpose(a, perm=None, name=’transpose’) 按照perm指定的维度顺序对x进行转置
tf.reverse(tensor, dim, name=None) 按指定的维度对张量元素逐维进行反转
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分解:把一个对称正定矩阵表示成一个下三角矩阵和其转置的乘积
tf.matrix_solve(matrix, rhs, adjoint=None, name=None) 求解矩阵方程,输入系数矩阵matrix与值矩阵rhs,返回答案矩阵
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
with tf.Session() as sess:
matrix_a = tf.diag([1, 2, 3, 4])
print(sess.run(matrix_a)) # 返回以[1, 2, 3, 4]作为对角线的矩阵
diag_a = tf.diag_part(matrix_a) # 返回矩阵的对角线部分
print(sess.run(diag_a))
trace_a = tf.trace(matrix_a) # 返回矩阵的迹
print(sess.run(trace_a))

matrix_b = [[[[0,1,2,3],[4,5,6,7],[8,9,10,11]],[[12,13,14,15],[16,17,18,19],[20,21,22,23]]]] # 四阶张量
matrix_c = tf.transpose(matrix_b, [2, 1, 0, 3]) # 按照新的维度顺序对张量进行转置(矩阵转置不用指定维度顺序)
print(sess.run(matrix_c))
matrix_d = tf.reverse(matrix_b, [1, 2]) # 对第2和第3个轴上的数据进行翻转(颠倒顺序)
print(sess.run(matrix_d))

matrix_e = [[4., 12., -16.], [12., 37., -43.], [-16., -43., 98.]]
det_e = tf.matrix_determinant(matrix_e) # 返回方阵的行列式(不支持int类型)
print(sess.run(det_e))
matrix_inv = tf.matrix_inverse(matrix_e) # 返回方阵的逆矩阵(不支持int类型)
print(sess.run(matrix_inv))
decomp = tf.cholesky(matrix_e) # 返回方阵的Cholesky分解矩阵(不支持int类型)
print(sess.run(decomp))
prod = tf.matmul(matrix_e, decomp) # 矩阵乘法(不支持int类型)
print(sess.run(prod))
coef = tf.constant([[2.,3.],[1.,1.]])
print(sess.run(tf.matrix_solve(coef, [[12.],[5.]]))) # 求解方程组: 2x+3y=12 x+y=5

规约运算

函数 描述
tf.reduce_sum(input_tensor, axis=None, name=None) 按照指定的轴对元素求和
tf.reduce_prod(input_tensor, axis=None, name=None) 按照指定的轴对元素求积
tf.reduce_min(input_tensor, axis=None, name=None) 按照指定的轴求元素的最小值
tf.reduce_max(input_tensor, axis=None, name=None) 按照指定的轴求元素的最大值
tf.reduce_mean(input_tensor, axis=None, name=None) 按照指定的轴求元素的平均值
tf.reduce_all(input_tensor, axis=None, name=None) 按照指定的轴对元素做与运算
tf.reduce_any(input_tensor, axis=None, name=None) 按照指定的轴对元素做或运算
1
2
3
4
5
6
7
8
9
10
with tf.Session() as sess:
matrix = [[2,3],[4,5]]
print(sess.run(tf.reduce_sum(matrix, 0))) # axis=0 按列规约
print(sess.run(tf.reduce_prod(matrix, 1))) # axis=1 按行规约
print(sess.run(tf.reduce_max(matrix, 0)))
print(sess.run(tf.reduce_min(matrix, 0)))
print(sess.run(tf.reduce_mean(matrix, 0)))
matrix_logic = [[True, True], [True, False]]
print(sess.run(tf.reduce_all(matrix_logic))) # 不设置axis对所有元素进行规约
print(sess.run(tf.reduce_any(matrix_logic, 0)))

索引运算

函数 描述
tf.argmin(input, axis, name=None) 返回指定轴上最小元素的索引
tf.argmax(input, axis, name=None) 返回指定轴上最大元素的索引
tf.where(condition, x=None, y=None, name=None) 根据条件返回相应的下标或元素值
tf.unique(x, name=None) 返回一个元组(y,idx),y是x的唯一化元素列表,idx为x的元素对应y元素的下标序列
tf.invert_permutation(x, name=None) 将x中元素值当做索引返回新的张量
tf.random_shuffle(input) 沿着input的第一维随机重新排列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
with tf.Session() as sess:
matrix = [[0,1,-1],[2,0,-3]]
print(sess.run(tf.argmin(matrix, 0))) # axis=0 按列计算
print(sess.run(tf.argmax(matrix, 0))) # axis=1 按行计算
x = [1,2,3,4]
y = [5,6,7,8]
cond = [True, False, False, True]
print(sess.run(tf.where(cond))) # 如果没有x, y则返回条件表达式中True的下标
print(sess.run(tf.where(cond, x, y))) # 条件表达式中True的下标对应x的值,False下标对应y的值
z = [1, 1, 2, 4, 8, 4, 1, 7, 8]
z_uni,idx = tf.unique(z) # 返回z中的唯一值列表,以及唯一值下标在z中的序列
print(sess.run([z_uni, idx]))
w = [3, 4, 0, 2, 1]
print(sess.run(tf.invert_permutation(w))) # 用z的值作为下标返回一个新序列(w中元素不能有重复)
print(sess.run(tf.random_shuffle(matrix))) # 随机地将张量沿着第一维度(最外层括号内部)打乱