tensorflow矩阵操作相关函数

(一)矩阵生成操作

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值