TensorFlow 中使用 tensor 来代表所有数据,操作间的数据传递也是tensor
tensor 可以看做是一个 n维的数组或列表,
每个tensor都包含 类型(type), 阶(rank), 形状(shape)
下面是在网上看到的一个问题及解决方法:
tensor 可以看做是一个 n维的数组或列表,
每个tensor都包含 类型(type), 阶(rank), 形状(shape)
1)类型
tensor类型 | Python类型 | 描述 |
DT_FLOAT | tf.float32 | 32位浮点数 |
DT_DOUBLE | tf.float64 | 64位浮点数 |
DT_INT64 | tf.int64 | 64位有符号整数 |
DT_INT32 | tf.int32 | 32位有符号整数 |
DT_INT16 | tf.int16 | 16位有符号整数 |
DT_INT8 | tf.int8 | 8位有符号整数 |
DT_UNIT8 | tf.unit8 | 8位无符号整数 |
DT_STRING | tf.string | 可变长度的字节数组,每个张量都是一个字节数组 |
DT_BOOL | tf.bool | 布尔型 |
DT_COMPLEX64 | tf.complex64 | 有两个32位浮点数组成的复数,实数和虚数 |
2)阶(rank)
指的是维度。张量的阶和矩阵的阶不是一个概念,主要是看有几层[],
标量、向量、矩阵的阶数
rank | 实例 | 例子 |
0 | 标量,只有大小 | a=1 |
1 | 向量(大小和方向) | b=[] |
2 | 矩阵(数据表) | c=[[], []] |
3 | 3阶张量(数据立体) | d=[[[], []], [[], []]] |
n | n阶 | 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, 满足条件就执行 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, |
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)