tensorflow的基础使用
一、图 graph
tensorflow是基于graph的并行计算架构。graph是静态的,构建gragh并不会运行。需要启动一个session,运行graph。比如a=(b+c)*(c+2)
的graph如下:(其中b+c 和 c+2是并行的)
二、张量 Tensor
阶
1 # 0阶张量就是标量,shape=[]
[1., 2., 3.] # 1阶张量就是向量,shape=[3]
[[1., 2., 3.], [4., 5., 6.]] # 2阶张量就是二维数组,shape=[2, 3]
[[[1., 2., 3.]], [[4., 5., 6.]]] # 3阶张量就是三维数组,shape=[2, 1, 3]
tf.zero
tf.zeros(shape, dtype=tf.float32, name=None)
# shape代表维度形状; dtype代码类型,默认是float32; name指定任意字符串
tf.zeros([2]) # [0. 0.]
tf.zeros([2,4]) # [[0. 0. 0. 0.] [0. 0. 0. 0.]]
tf.constant 常量
tf.constant(value, dtype=None, shape=None, name='Const')
# value 张量数值,dtype默认int32
tf.constant(1) # 0阶张量,标量
tf.constant([1, 2]) # 1阶张量,一维数组
tf.constant([[1, 2],[3, 4]]) # 2阶张量,二维数组
tf.constant([['Apple', 'Orange'], ['Potato', 'Tomato']], dtype=tf.string) # 2阶,字符串
tf.range 序列
range(start, limit, delta=1, dtype=None, name='range')
tf.range(10, 15) # [10 11 12 13 14]
tf.range(3, 1, -0.5) # [3. 2.5 2 1.5]
tf.random_normal 随机数
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
# 正太分布的数值中取指定个数的值
# shape是维度形状,mean是正态分布的均值,stddev是正态分布的标准差
tf.random_normal([2, 3], stddev=1)
#[[-0.81131822 1.48459876 0.06532937]
# [-2.4427042 0.0992484 0.59122431]]
三、运算
运行规则
- 相同大小 Tensor 之间的任何算术运算都会将运算应用到元素级
- 不同大小 Tensor(要求dimension 0 必须相同) 之间的运算叫做广播(broadcasting)
- Tensor 与 Scalar(0维 tensor) 间的算术运算会将那个标量值传播到各个元素
- TensorFlow 在进行数学运算时,一定要求各个 Tensor 数据类型一致
基本数学运算
# 算术操作符:+ - * / %
tf.add(x, y, name=None) # 加法(支持 broadcasting)
tf.subtract(x, y, name=None) # 减法
tf.multiply(x, y, name=None) # 乘法
tf.divide(x, y, name=None) # 浮点除法, 返回浮点数(python3 除法)
tf.mod(x, y, name=None) # 取余
# 幂指对数操作符:^ ^2 ^0.5 e^ ln
tf.pow(x, y, name=None) # 幂次方
tf.square(x, name=None) # 平方
tf.sqrt(x, name=None) # 开根号,必须传入浮点数或复数
tf.exp(x, name=None) # 计算 e 的次方
tf.log(x, name=None) # 以 e 为底,必须传入浮点数或复数
# 取符号、负、倒数、绝对值、近似、两数中较大/小的
tf.negative(x, name=None) # 取负(y = -x).
tf.sign(x, name=None) # 返回 x 的符号
tf.reciprocal(x, name=None) # 取倒数
tf.abs(x, name=None) # 求绝对值
tf.round(x, name=None) # 四舍五入
tf.ceil(x, name=None) # 向上取整
tf.floor(x, name=None) # 向下取整
tf.rint(x, name=None) # 取最接近的整数
tf.maximum(x, y, name=None) # 返回两tensor中的最大值 (x > y ? x : y)
tf.minimum(x, y, name=None) # 返回两tensor中的最小值 (x < y ? x : y)
# 三角函数和反三角函数
tf.cos(x, name=None)
tf.sin(x, name=None)
tf.tan(x, name=None)
tf.acos(x, name=None)
tf.asin(x, name=None)
tf.atan(x, name=None)
# 其它
tf.div(x, y, name=None) # python 2.7 除法, x/y-->int or x/float(y)-->float
tf.truediv(x, y, name=None) # python 3 除法, x/y-->float
tf.floordiv(x, y, name=None) # python 3 除法, x//y-->int
tf.realdiv(x, y, name=None)
tf.truncatediv(x, y, name=None)
tf.floor_div(x, y, name=None)
tf.truncatemod(x, y, name=None)
tf.floormod(x, y, name=None)
tf.cross(x, y, name=None)
tf.squared_difference(x, y, name=None)
矩阵函数
# 矩阵乘法(tensors of rank >= 2)
tf.matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=None)
# 转置,可以通过指定 perm=[1, 0] 来进行轴变换
tf.transpose(a, perm=None, name='transpose')
# 在张量 a 的最后两个维度上进行转置
tf.matrix_transpose(a, name='matrix_transpose')
# Matrix with two batch dimensions, x.shape is [1, 2, 3, 4]
# tf.matrix_transpose(x) is shape [1, 2, 4, 3]
# 求矩阵的迹
tf.trace(x, name=None)
# 计算方阵行列式的值
tf.matrix_determinant(input, name=None)
# 求解可逆方阵的逆,input 必须为浮点型或复数
tf.matrix_inverse(input, adjoint=None, name=None)
# 奇异值分解
tf.svd(tensor, full_matrices=False, compute_uv=True, name=None)
# QR 分解
tf.qr(input, full_matrices=None, name=None)
# 求张量的范数(默认2)
tf.norm(tensor, ord='euclidean', axis=None, keep_dims=False, name=None)
# 构建一个单位矩阵, 或者 batch 个矩阵,batch_shape 以 list 的形式传入
tf.eye(num_rows, num_columns=None, batch_shape=None, dtype=tf.float32, name=None)
# Construct one identity matrix.
tf.eye(2) ==> [[1., 0.],[0., 1.]]
# Construct a batch of 3 identity matricies, each 2 x 2.
# batch_identity[i, :, :] is a 2 x 2 identity matrix, i = 0, 1, 2.
batch_identity = tf.eye(2, batch_shape=[3])
# Construct one 2 x 3 "identity" matrix
tf.eye(2, num_columns=3) ==> [[ 1., 0., 0.], [ 0., 1., 0.]]
# 构建一个对角矩阵,rank = 2*rank(diagonal)
tf.diag(diagonal, name=None)
# 'diagonal' is [1, 2, 3, 4]
tf.diag(diagonal) ==> [[1, 0, 0, 0]
[0, 2, 0, 0]
[0, 0, 3, 0]
[0, 0, 0, 4]]
四、变量 Variable
tf.Variable 定义
tf.Variable(initial_value, trainable=True, collections=None, validate_shape=True, name=None)
# initial_value 初始值;trainable为true时加入到GraphKeys,会被使用Optimizer;
# collections 变量类型,默认为GraphKeys.GLOBAL_VARIABLE
# validate_shape 类型和维度检查
# name 指定变量名称,如果没有则系统生成
# 举例:Create two variables.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")
# 举例:当一个变量依赖另一个变量
weights2 = tf.Variable(weights.initialized_value() * 0.2, name="w2")
初始化
变量的初始化需要在模型中执行,单个变量初始化如下:
# 在session中启动graph.
with tf.Session() as sess:
# variable初始化.
sess.run(weights.initializer)
# ...现在可以运行使用'weights'的op...
可以使用tf.global_variables_initializer()
操作完成所有变量初始化,如下:
# Add an op to initialize the variables.
init_op = tf.global_variables_initializer()
# Later, when launching the model
with tf.Session() as sess:
# Run the init operation.
sess.run(init_op)
# Use the model
...
保存与恢复
用tf.train.Saver()
创建Saver
来保存所有的变量,如下:
# Add ops to save and restore all the variables.
saver = tf.train.Saver()
# Later, launch the model, initialize the variables, do some work, save the
# variables to disk.
with tf.Session() as sess:
sess.run(init_op)
# Do some work with the model.
..
# Save the variables to disk.
save_path = saver.save(sess, "/tmp/model.ckpt")
print "Model saved in file: ", save_path
同样使用Saver恢复变量,当要从文件恢复变量时不需要对它们初始化,如下:
# Add ops to save and restore all the variables.
saver = tf.train.Saver()
# Later, launch the model, use the saver to restore variables from disk, and
# do some work with the model.
with tf.Session() as sess:
# Restore variables from disk.
saver.restore(sess, "/tmp/model.ckpt")
print "Model restored."
# Do some work with the model
...
五、会话 Session
用于执行graph。有两种方式,方式一如下:
import tensorflow as tf
matrix1 = tf.constant([[3, 3]])
matrix2 = tf.constant([[2],[2]])
product = tf.matmul(matrix1, matrix2) # matrix multiply np.dot(m1, m2)
# method 1
sess = tf.Session()
result = sess.run(product)
print(result)
sess.close()
# method 2
with tf.Session() as sess:
result2 = sess.run(product)
print(result2)
六、占位 placeholder
在构建graph时没有传入数据,等建立session后,在session中通过feed_dict()
函数传入数据。
tf.placeholder(dtype,shape=None,name=None)
# dtype:数据类型。常用的是tf.float32,tf.float64等数值类型
# shape:数据形状。默认是None,就是一维值,也可以是多维(比如[2,3], [None, 3]表示列是3,行不定)
# name:名称
# 举例如下:
import tensorflow as tf
import numpy as np
x = tf.placeholder(tf.float32, shape=(1024, 1024))
y = tf.matmul(x, x)
with tf.Session() as sess:
#print(sess.run(y)) # ERROR:此处x还没有赋值
rand_array = np.random.rand(1024, 1024)
print(sess.run(y, feed_dict={x: rand_array}))
七、简单代码范例
用TensorFlow计算a = (b+c) * (c+2)
,参考学习:python-tensorflow-tutorial
定义数据
import tensorflow as tf
# first, create a TensorFlow constant
const = tf.constant(2.0, name="const")
# create TensorFlow variables
b = tf.placeholder(tf.float32, name='b')
c = tf.placeholder(tf.float32, name='c')
构建操作
# 创建operation
d = tf.add(b, c, name='d')
e = tf.add(c, const, name='e')
a = tf.multiply(d, e, name='a')
创建会话
# session
with tf.Session() as sess:
a_out = sess.run(a, feed_dict={b:[2, 3, 4], c:1})
print("Variable a is {}".format(a_out))
# 打印结果如下:
# Variable a is [ 9. 12. 15.]