(一)矩阵生成操作
def ones(shape, dtype=dtypes.float32, name=None)://创建一个形状为shape的矩阵 元素值都为1,默认元素类型float32
def zeros(shape, dtype=dtypes.float32, name=None)://创建一个形状为shape的矩阵 元素值都为0,默认元素类型float32
def ones_like(tensor, dtype=None, name=None, optimize=True)://创建一个和张量tensor形状一致的矩阵 元素值都为1
def zeros_like(tensor, dtype=None, name=None, optimize=True)://创建一个和张量tensor形状一致的矩阵 元素值都为0
def fill(dims, value, name=None): //创建一个形状大小为shape的tensor,其初始值为value,数据类型和value的数据类型保持一致
sess = tf.InteractiveSession()
x1 = tf.ones([2, 3], tf.int32)
print(sess.run(x1))
#[[1 1 1]
#[1 1 1]]
x2 = tf.zeros([1, 2], tf.float32)
print(sess.run(x2))
#[[0. 0.]]
tensor=[[1, 2, 3], [4, 5, 6]]
x3 = tf.ones_like(tensor)
print(sess.run(x3))
#[[1 1 1]
#[1 1 1]]
x4 = tf.zeros_like(tensor, tf.float32)
print(sess.run(x4))
#[[0. 0. 0.]
#[0. 0. 0.]]
x5 = tf.fill([2,2],1.0)
print(sess.run(x5))
#[[1. 1.]
#[1. 1.]]
def random_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None) //正太分布随机数,生成一个shape形状的矩阵,均值mean,标准差stddev 。
def truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None) //截断正态分布随机数,生成一个shape形状的矩阵,均值mean,标准差stddev。和一般的正太分布的产生随机数据比起来,这个函数产生的随机数与均值的差距不会超过两倍的标准差。该函数对比random_normal,矩阵里面的元素不会离均值太远或者太近。举例,当输入参数mean = 0 , stddev =1时,使用tf.truncated_normal的输出是不可能出现[-2,2]以外的点的。
def random_uniform(shape,minval=0,maxval=None,dtype=tf.float32,seed=None,name=None) //均匀分布随机数,生成一个shape形状的矩阵,元素值范围为[minval,maxval]
sess = tf.InteractiveSession()
x1 = tf.random_normal(shape=[1,5],mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)
print(sess.run(x1))
#[[-0.30120787 -0.0505796 1.1938052 0.19710326 0.5720447 ]]
x2 = tf.truncated_normal(shape=[1,5],mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)
print(sess.run(x2))
#[[-0.5444954 0.8262541 -1.6569115 0.44797668 -1.3212199 ]]
x3 = tf.random_uniform(shape=[1,5], minval=1.0,maxval=2.0,dtype=tf.float32,seed=None,name=None)
print(sess.run(x3))
#[[1.1269865 1.9669617 1.6314322 1.1152394 1.7218542]]
(二)矩阵数据转换操作
tf.to_double(x, name=’ToDouble’) //将数据x转为64位浮点类型
tf.to_float(x, name=’ToFloat’) //将数据x转为32位浮点类型
tf.to_int32(x, name=’ToInt32’) //将数据x转为32位整形
tf.to_int64(x, name=’ToInt64’) //将数据x转为64位整形
以上函数可能会再未来版本被弃用。
tf.cast(x, dtype, name=None)//将张量x转为dtype类型
sess = tf.InteractiveSession()
tensor=[[1, 2, 3]]
x1 = tf.cast(tensor,tf.float32)
print(sess.run(x1))
#[[1. 2. 3.]]
x2 = tf.to_int32(x1)
print(sess.run(x2))
#[[1 2 3]]
x3 = tf.to_float(x2)
print(sess.run(x3))
#[[1. 2. 3.]]
3.矩阵形状变换
tf.shape(input, name=None)//返回数据的shape
tf.size(input, name=None)//返回数据的元素数量
tf.rank(input, name=None)//返回tensor的rank,此rank不同于矩阵的rank,tensor的rank表示一个tensor需要的索引数目来唯一表示任何一个元素,也就是通常所说的 “order”, “degree”或”ndims”。
tf.reshape(tensor, shape, name=None)//改变tensor的形状,如果shape有元素[-1],表示在该维度打平至一维,自动推导。
tf.expand_dims(input, dim, name=None)//插入维度1进入一个tensor中
sess = tf.InteractiveSession()
tensor= [[[1, 1, 1, 1], [2, 2, 2, 2]], [[3, 3, 3, 3], [4, 4, 4, 4]]]
x1 = tf.shape(tensor)
print(sess.run(x1))
#[2 2 4]
x2 = tf.size(tensor)
print(sess.run(x2))
#16
x3 = tf.rank(tensor)
print(sess.run(x3))
#3
x4 = tf.reshape(tensor, [2, -1])
print(sess.run(x4))
#[[1 1 1 1 2 2 2 2]
#[3 3 3 3 4 4 4 4]]
print(sess.run(tf.shape(tf.expand_dims(tensor, 0))))
#[1 2 2 4]
print(sess.run(tf.shape(tf.expand_dims(tensor, 2))))
#[2 2 1 4]
4.切片与合并
tf.slice(input_, begin, size, name=None)//对tensor进行切片操作,其中“input_”是你输入的tensor,就是被切的那个。
“begin”是每一个维度的起始位置,“size”相当于问每个维度拿几个元素出来。
sess = tf.InteractiveSession()
tensor = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], [6, 6, 6]]])
#tensor的shape为[3, 2, 3],begin第一个元素为1 size第一个元素为1 表示切下[[3, 3, 3], [4, 4, 4]]
#begin第二个元素为0 size第二个元素为1 表示切下[3, 3, 3]
#begin第三个元素为0 size第三个元素为3 表示[3, 3, 3]从第0个元素开始 切下3个元素
x1 = tf.slice(tensor, [1, 0, 0], [1, 1, 3])
print(sess.run(x1))
#[[[3 3 3]]]
print(sess.run(tf.shape(x1)))
#[1 1 3]
5.归约计算(Reduction)
tf.reduce_sum(input_tensor, reduction_indices=None, keep_dims=False, name=None)//reduction_indices指定的轴进行求和
tf.reduce_min(input_tensor, reduction_indices=None, keep_dims=False, name=None)//reduction_indices指定的轴进行求最小值
tf.reduce_max(input_tensor, reduction_indices=None, keep_dims=False, name=None)//reduction_indices指定的轴进行求最大值
tf.reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)//reduction_indices指定的轴进行求平均值
sess = tf.InteractiveSession()
tensor = [[1, 2, 3], [4, 5, 6]]
#axis=0 行与行之间的计算 axis=1 列与列之间的计算 axis=None 计算全家维度 #keep_dims = true 保持原有的shape
print(sess.run(tf.reduce_sum(tensor, 0)))
print(sess.run(tf.reduce_sum(tensor, 1)))
print(sess.run(tf.reduce_sum(tensor, 0, keep_dims=True)))
print(sess.run(tf.reduce_sum(tensor, 1, keep_dims=True)))
#[5 7 9]
#[ 6 15]
#[[5 7 9]]
#[[ 6]
#[15]]
print(sess.run(tf.reduce_max(tensor, 0)))
print(sess.run(tf.reduce_max(tensor, 1)))
print(sess.run(tf.reduce_max(tensor)))
#[4 5 6]
#[3 6]
#6
print(sess.run(tf.reduce_mean(tensor, 0)))
print(sess.run(tf.reduce_mean(tensor, 1)))
print(sess.run(tf.reduce_mean(tensor)))
#数据不是float 精度损失
#[2 3 4]
#[2 5]
#3
6.序列比较与索引提取
tf.argmin(input, axis=None, name=None, dimension=None, output_type=dtypes.int64)//返回axis上的最小值的坐标
tf.argmax(input, axis=None, name=None, dimension=None, output_type=dtypes.int64)//返回axis上的最小值的坐标
sess = tf.InteractiveSession()
tensor = [[1, 3, 1], [6, 5, 4]]
print(sess.run(tf.argmax(tensor, axis=0)))
print(sess.run(tf.argmax(tensor, axis=1)))
print(sess.run(tf.argmin(tensor, axis=0)))
print(sess.run(tf.argmin(tensor, axis=1)))
#[1 1 1]
#[1 0]
#[0 0 0]
#[0 2]
7.基本数学函数
(1)算术操作符:+ - * / %
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) # 取余
sess = tf.InteractiveSession()
tensor1 = tf.constant([[1.5, 3.2, 1.7], [6.3, 5.5, 4.8]])
tensor2 = tf.constant([[4.9, 7.3, 2.7], [3.1, 4.5, 2.3]])
list1 = [[1.5, 3.2, 1.7], [6.3, 5.5, 4.8]]
list2 = [[4.9, 7.3, 2.7], [3.1, 4.5, 2.3]]
print(type(tensor1))
print(type(list1))
print(sess.run(tf.add(tensor1, tensor2)))
print(sess.run(tensor1+tensor2))
#error 这里只能用tensor 不能用list
#print(sess.run(list1+list2))
print(sess.run(tensor1/tensor2))
print(sess.run(tf.mod(tensor1, tensor2)))
result:
<class 'tensorflow.python.framework.ops.Tensor'>
<class 'list'>
[[ 6.4 10.5 4.4 ]
[ 9.4 10. 7.1000004]]
[[ 6.4 10.5 4.4 ]
[ 9.4 10. 7.1000004]]
[[0.30612245 0.43835616 0.6296296 ]
[2.0322583 1.2222222 2.0869567 ]]
[[1.5 3.2 1.7 ]
[0.10000038 1. 0.20000029]]
上例代码中可以看到,tensorflow中有些运算数据输入一定是tensor, 而不能是python中的数组。大部分情况下,两者在运算中可通用。
(2)幂指对数操作符:
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 为底,必须传入浮点数或复数
sess = tf.InteractiveSession()
tensor1 = tf.constant([[1.5, 3.2, 1.7], [6.3, 5.5, 4.8]])
print(sess.run(tensor1))
print(sess.run(tf.pow(tensor1, 2)))
tensor2 = tf.square(tensor1)
print(sess.run(tensor2))
print(sess.run(tf.sqrt(tensor2)))
(3) 取符号、负、倒数、绝对值、近似、两数中较大/小的
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)
sess = tf.InteractiveSession()
tensor1 = tf.constant([[1.5, -3.2, 1.7]])
print(sess.run(tf.negative(tensor1)))
print(sess.run(tf.sign(tensor1)))
print(sess.run(tf.reciprocal(tensor1)))
print(sess.run(tf.abs(tensor1)))
print(sess.run(tf.round(tensor1)))
print(sess.run(tf.ceil(tensor1)))
print(sess.run(tf.floor(tensor1)))
result:
[[-1.5 3.2 -1.7]]
[[ 1. -1. 1.]]
[[ 0.6666667 -0.3125 0.58823526]]
[[1.5 3.2 1.7]]
[[ 2. -3. 2.]]
[[ 2. -3. 2.]]
[[ 1. -4. 1.]]
(4)三角函数和反三角函数
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)
7.矩阵特性运算
def transpose(a, perm=None, name="transpose", conjugate=False) #求转置矩阵,a是矩阵数据,perm指定转置方式,例如[1,0]就是将第一维与第二维调转,实现的是一般二维矩阵的转置。conjugate表示是否为复数共轭矩阵。
import tensorflow as tf
sess = tf.InteractiveSession()
tensor1 = tf.constant([[1, 2, 3], [4, 5, 6]])
#普通二维矩阵转置
print(sess.run(tf.transpose(tensor1,[0,1])))
#保持原样
print(sess.run(tf.transpose(tensor1,[1,0])))
print("------------------------------")
#这是一个2*2*3的三维矩阵
tensor2 = tf.constant([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
#保持原样
print(sess.run(tf.transpose(tensor2,[0,1,2])))
#转置为3*2*2的三维矩阵 这个地方要搞清楚转换规则
print(sess.run(tf.transpose(tensor2,[2,1,0])))
result:
[[1 2 3]
[4 5 6]]
[[1 4]
[2 5]
[3 6]]
------------------------------
[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]
[[[ 1 7]
[ 4 10]]
[[ 2 8]
[ 5 11]]
[[ 3 9]
[ 6 12]]]
tf.matmul(a, b, transpose_a=False, transpose_b=False, a_is_sparse=False, b_is_sparse=False, name=None)#矩阵相乘
a,b为输入矩阵,其数据类型必须一致,不然报错。transpose_,_is_sparse分别代表是否转置和是否为稀疏矩阵。
import tensorflow as tf
sess = tf.InteractiveSession()
tensor1 = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3])
tensor2 = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2])
print(sess.run(tf.matmul(tensor1,tensor2)))
result:
[[ 58 64]
[139 154]]
tf.matrix_inverse(input, adjoint=None, name=None)#方阵的逆矩阵
input输入的矩阵数据类型必须是`float64`, `float32`, `complex64`, `complex128`,整形会报错。如果输入方阵不可逆,也会报错。Input is not invertible。
import tensorflow as tf
sess = tf.InteractiveSession()
tensor1 = tf.constant([1.0, 0, 0, 0, 1, 0, 0, 0, 1], shape=[3, 3])
print(sess.run(tf.matrix_inverse(tensor1)))
result:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
8.Tensorflow 广播机制举例
m*n矩阵与1*n,m*1或1*1矩阵进行算术操作时,会自动将行向量或列向量矩阵复制扩展为m*n。
sess = tf.InteractiveSession()
tensor1 = tf.constant([[1, 2, 3], [4, 5, 6]])
tensor2 = tf.constant([[1, 2, 3]])
tensor3 = tf.constant([[2],[3]])
tensor4 = tf.constant([4])
#error
#tensor5 = tf.constant([1,2])
print(sess.run(tf.add(tensor1, tensor2)))
print(sess.run(tf.add(tensor1, tensor3)))
print(sess.run(tf.add(tensor1, tensor4)))
result:
[[2 4 6]
[5 7 9]]
[[3 4 5]
[7 8 9]]
[[ 5 6 7]
[ 8 9 10]]