TensorFlow基本类型及操作函数

TensorFlow 中使用 tensor 来代表所有数据,操作间的数据传递也是tensor
tensor 可以看做是一个 n维的数组或列表,
每个tensor都包含 类型(type), 阶(rank), 形状(shape)
1)类型  
tensor类型    Python类型      描述
DT_FLOAT   tf.float32  32位浮点数
DT_DOUBLE   tf.float64  64位浮点数
DT_INT64  tf.int6464位有符号整数
DT_INT32  tf.int32  32位有符号整数
DT_INT16 tf.int1616位有符号整数
DT_INT8tf.int8  8位有符号整数
DT_UNIT8 tf.unit8 8位无符号整数
DT_STRINGtf.string可变长度的字节数组,每个张量都是一个字节数组
DT_BOOLtf.bool 布尔型
DT_COMPLEX64tf.complex64有两个32位浮点数组成的复数,实数和虚数        
2)阶(rank)

指的是维度。张量的阶和矩阵的阶不是一个概念,主要是看有几层[],

标量、向量、矩阵的阶数

rank实例例子
0标量,只有大小a=1
1向量(大小和方向) b=[]
2矩阵(数据表) c=[[], []]
33阶张量(数据立体)d=[[[], []], [[], []]]
nn阶 e=[[[[[...]]]]] n层[]                                    
3)shape
shape用于组织张量内部的组织关系。shape可以通过Python中的整数列表或元组来表示

也可以用 TensorFlow 中的相关函数来描述

tensor的相关操作
主要包括:类型转换、数值操作、形状变换、数据操作
类型转换                   
tf.string_to_number(string_tensor, name=None) 字符串转换为数字
tf.to_double(x, name=None)   转换为64位浮点数
tf.to_float(x, name=None)  转换为32位浮点数
tf.to_int32(x, name=None)  转换为32位整数
tf.to_int64(x, name=None)   转换为64位整数
tf.to_cast(x, dtype, name=None) 将x或x.values 转换为dtype所指定的类型
数值操作
函数                                                                      描述
tf.ones(shape, dtype)  指定shape和dtype生成值为1的张量
tf.ones_like(input)   生成和输入向量一样的形状和类型的1
tf.zeros(shape, dtype)  指定shape和dtype生成值为1的张量
tf.zeros_like(input)   生成和输入向量一样的形状和类型的1
tf.fill(shape, value) 为指定形状填值
tf.constant(value, shape)生成常量
tf.set_random_seed(seed) 设置随机数种子
tf.random_normal(shape, mean=0., stddev=1.,   dtype=tf.float32, seed=None, name=None)正态随机分布 均值mean,标准差stddev

tf.random_uniform(shape, minval=0,  maxval=None, 

dtype=tf.float32, seed=None,name=None)

均匀分布随机数 范围[minval, maxval]

tf.truncated_normal(shape, mean=0., stddev=1.,  

dtype=tf.float32, seed=None,  name=None)                     

截断正态随机分布 均值mean,标准差stddev 只保留[mean-2*stddev, mean+2*stddev]  范围内的随机数
tf.random_crop(value, size, seed=None, name=None)       将输入值value按照size尺寸随机剪辑
tf.linspace(start, stop, num, name=None)                 在[start,stop]范围内产生num个数的等差数列
tf.range(start, limit=None, delta=1, name='range')       在[start,limit)范围内以步进值delta等差数列
形状变换   
函数  描述
tf.shape(input, name=None) 返回一个张量, 其值为输入参数input的shape。input可以是张量,也可以是数组或list
tf.reshape(input, shape, name=None)将原有的输入数据shape按照指定的形状进行变换,生成一个新的张量
tf.size(input, name=None)  返回一个张量,其值为input的元素数量
tf.rank(input, name=None)返回一个张量,其值为input的rank
tf.expand_dims(input, dim, name=None) 在tensor中插入一个维度  tf.expand_dim(t, num)   num=0,1,2...
tf.squeeze(input, dim, name=None)去除一个维度
数据操作
函数 描述
tf.slice(input_, begin, size, name=None) 对input进行切片操作, begin和size可以为list类型
tf.split(value, num_or_size_splits,       
         axis=0,num=None,name='split')
沿着某一维度将tensor分离为num_or_size_splits
tf.concat(values, axis, name="concat") 沿着某一维度连接tensor
tf.stack(values, axis=0, name="stack")  将多个tensor沿着某一轴组合成新的张量
tf.unstack(value, num=None, axis=0, name="unstack") 沿着某一维度拆分 tensor  axis=0 按行, axis=1 按列
tf.gather(params, indices, validate_indices=None, name=None, axis=0)合并索引indices所指示params中的切片
tf.one_hot(indices,depth, on_value=None, off_value=None,   
            axis=None, dtype=None, name=None)
生成符合one_hot编码的张量
tf.count_nonzero(input_tensor, axis=None,keepdims=None,    
                  dtype=dtypes.int64, name=None,
                  reduction_indices=None,
                  keep_dims=None)
统计非0个数
算术运算函数
函数                                       描述
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.div()
tf.mod(x, y, name=None)                               取模
tf.abs(x, name=None)                               求绝对值
tf.negative(x, name=None)                               取负
tf.sign(x, name=None)                               返回x的符号
tf.inv(x, name=None)                                    取反
tf.square(x, name=None)                               
tf.round(x, name=None)                               舍入最接近的整数
tf.sqrt(x, name=None)                               开根号
tf.pow(x, y, name=None)                                  幂运算
tf.exp(x, name=None)                              e的次方
tf.log(x, name=None)                               计算对数
tf.maximum(x, y, name=None)                              返回最大值
tf.minimum(x, name=None)                               返回最小值
tf.cos(x, name=None)                               三角函数 cos
tf.cos(x, name=None)                               三角函数 cos
tf.sin(x, name=None)                               三角函数 sin
tf.tan(x, name=None)                               三角函数 tan

tf.atan(x, name=None)                               

三角函数 ctan


tf.cond(pred, true_fn=None, false_fn=None,    
         strict=False, name=None,
         fn1=None, fn2=None)

 满足条件就执行 fn1, 否则执行 fn2



矩阵运算 
函数  描述
tf.diag(diagonal, name=None)  返回一个给定对角值的对角tensor
tf.diag_part(input, name=None) 获得tensor的对角线上的值
tf.trace(x, name=None)  计算一个tensor的迹  即对角线的和
计算一个tensor的迹  即对角线的和计算一个tensor的迹  即对角线的和    按照参数perm指定的维度顺序对a进行转置操作
tf.reverse(tensor, axis, name=None) 沿着指定的维度对输入进行反转, axis为输入shape的索引列表
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)    
矩阵相乘
tf.matrix_determinant(input, name=None) 返回方阵的行列式
tf.matrix_inverse(input, adjoint=False, name=None)  求方阵的逆矩阵, adjoint为True时,计算输入共轭矩阵的逆矩阵
tf.cholesky(input, name=None)  对输入方阵进行cholesky分解,即把一个对称正定矩阵表示成一个下三角矩阵和其转置的乘积的分解 A=LL^T
tf.matrix_solve(matrix, rhs, adjoint=False,                                               name=None)  求解矩阵方程,返回矩阵变量  matrix为矩阵变量的系数, rhs为矩阵方程的结果
复数操作                     
函数  描述
tf.complex(real, imag, name=None)  将两个实数转换为复数形式
tf.complex_abs(x, name=None) 计算复数的绝对值, 即长度
tf.conj(input, name=None) 计算共轭素数
tf.imag(input, name=None)提取复数的虚部
tf.real(input, name=None)  提取复数的实部
tf.fft(input, name=None) 计算一为的离散傅里叶变换,输入数据类型为 complex64
规约计算
函数  描述
tf.reduce_sum(input_tensor, axis=None, keepdims=None,            
               name=None, reduction_indices=None,
               keep_dims=None)
按照指定轴对input_tensor进行求和
tf.reduce_prod(input_tensor, axis=None, keepdims=None,           
                name=None, reduction_indices=None,
                keep_dims=None)
按照指定轴对input_tensor进行求积
tf.reduce_min(input_tensor, axis=None, keepdims=None,           
               name=None, reduction_indices=None,
               keep_dims=None)
 求input_tensor中的最小值
tf.reduce_max(input_tensor, axis=None, keepdims=None,            
               name=None, reduction_indices=None,
               keep_dims=None)
求input_tensor中的最大值
tf.reduce_mean(input_tensor, axis=None, keepdims=None,           
                name=None, reduction_indices=None,
                keep_dims=None)
求input_tensor中的平均值
tf.reduce_all(input_tensor, axis=None, keepdims=None,           
               name=None, reduction_indices=None,
               keep_dims=None)
 对input_tensor中的各元素求逻辑'与'
tf.reduce_any(input_tensor, axis=None, keepdims=None,          
               name=None, reduction_indices=None,
               keep_dims=None)
  对input_tensor中的各元素求逻辑'或'
分割                  
函数 描述
tf.segment_sum(data, segment_ids, name=None)   沿着segment_ids指定的维度,分割张量data中的值,并且返回累加值
tf.segment_prod(data, segment_ids, name=None)  根据segment_ids的分段计算各个片段的积
tf.segment_min(data, segment_ids, name=None)根据segment_ids的分段计算各个片段的最小值
tf.segment_max(data, segment_ids, name=None)  根据segment_ids的分段计算各个片段的最大值
tf.segment_mean(data, segment_ids, name=None) 根据segment_ids的分段计算各个片段的平均值
tf.unsorted_segment_sum(data, segment_ids, num_segment, name=None) 与tf.segment_sum类似,但是tf.segment_sum可以无序
tf.sparse_segment_sum(data, indices, segment_ids, name=None) 对data进行稀疏分割求和
序列比较于索引提取                              
函数  描述
tf.argmin(input, axis, name=None)根据给出的axis,返回input中最小值的索引
tf.argmax(input, axis, name=None) 根据给出的axis,返回input中最大值的索引
tf.setdiffld(x, y, name=None) 返回x,y中不同值得索引
tf.where(condition, c=None, y=None, name=None)

根据指定的条件,返回对应的值或坐标,若x,y都为None

返回condition值为True的坐标,若都不为None,
返回值为True的坐标在x内的值,condition值为False的坐标在y内的值

tf.unique(x, name=None)返回一个tuple(y,idx), y为x列表的唯一化数据列表,idx为x数据对应y元素的index
tf.invert_permutation(x, name=None) 计算序列的逆置换(inverse permutation)
本操作是计算张量的索引的逆置换。
x是一维的整数张量,表示一个以0为开始的索引数组,然后根据这里元素的值来放入整数,
计算公式如下:
                        y[x[i]] = i for i in [0, 1, ..., len(x) -1]
tf.random_shuffle(input)   沿着input的第一维进行随机重新排列
错误类          
函数 描述
class tf.OpError  一个基本的错误类型,在当tf执行失败时报错
tf.OpError.op  返回执行失败的操作节点,有的操作如Send或Recv可能不会返回,则要用到node_def
tf.OpError.node_def 以NodeDef proto形式返回表示失败的OP
tf.OpError.error_code 错误代码
tf.OpError.message错误信息
class tf.errors.CancelledError当操作或者阶段取消时报错
class tf.errors.UnknownError未知错误类型
class tf.errors.InvalidArgumentError非法参数报错
class tf.errors.NotFountError找不到请求的实体时报错,例如文件、目录
class tf.errors.AlreadyExistsError 当创建的实体已经存在时报错
class tf.errors.PermissionDeniedError 没有执行权限
class tf.errors.ResourceExhaustError  资源耗尽报错
class tf.errors.FailedPreconditionError 系统没有条件执行某个行为
class tf.errors.AbortedError 操作终止时报错,常发生在并发情况
class tf.errors.OutOfRangeError  超出范围报错
class tf.errors.UnimplementedError 某个操作没有执行时报错
class tf.errors.InternalError 系统内部错误
class tf.errors.DataLossError 当出现不可恢复的错误
tf.errors.XXXXX.__init__(node_def, op, message) 使用该方式创建以上各种错误类
下面是在网上看到的一个问题及解决方法:
tf.unsorted_segment_sum(tf.constant([0.2, 0.1, 0.5, 0.7, 0.8]),
                        tf.constant([0, 0, 1, 2, 2]), 3)
上面输出结果为:   array([ 0.3,  0.5 , 1.5 ], dtype=float32)
tf.unsorted_segment_sum(tf.constant([[0.2, 0.1, 0.5, 0.7, 0.8],
                                     [0.2, 0.2, 0.5, 0.7, 0.8]]),
                        tf.constant([[0, 0, 1, 2, 2],
                                     [0, 0, 1, 2, 2]]), 3)
上面这个的输出为:  array([ 0.7,  1. ,  3. ], dtype=float32)
如果想要输出下面的结果,应该怎么办呢?
array([ [ 0.3,  0.5 , 1.5 ], [ 0.4, 0.5, 1.5 ] ], dtype=float32)
第一: 通过转置
import tensorflow as tf
with tf.Session() as sess:
    data = tf.constant([[0.2, 0.1, 0.5, 0.7, 0.8],
                        [0.2, 0.2, 0.5, 0.7, 0.8]])
    idx = tf.constant([0, 0, 1, 2, 2])
    result = tf.transpose(tf.unsorted_segment_sum(tf.transpose(data), idx, 3))
    print(sess.run(result))
Output:
[[ 0.30000001  0.5         1.5       ]
 [ 0.40000001  0.5         1.5       ]]
第二:
data = tf.constant([[0.2, 0.1, 0.5, 0.7, 0.8],
                    [0.2, 0.2, 0.5, 0.7, 0.8]])
segment_ids = tf.constant([[0, 0, 1, 2, 2],
                           [0, 0, 1, 2, 2]])
num_segments = 3
rows = []
for data_i, ids_i in zip(data, segment_ids):
    rows.append(tf.unsorted_segment_sum(data_i, ids_i))
result = tf.stack(rows, axis=0)
第三:
num_rows = tf.shape(segment_ids)[0]
rows_idx = tf.range(num_rows)
segment_ids_per_row = segment_ids + num_segments * tf.expand_dims(rows_idx, axis=1)
seg_sums = tf.unsorted_segment_sum(data, segment_ids_per_row,
                                   num_segments * num_rows)
result = tf.reshape(seg_sums, [-1, num_segments])
Output:
array([[ 0.3, 0.5, 1.5 ],
       [ 0.4, 0.5, 1.5 ]], dtype=float32)

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值