并行计算能让代价大的算法计算加速执行,TensorFlow也在实现上对复杂操作进行了有效的改进。大部分核相关的操作都是设备相关的实现,比如GPU。下面是一些重要的操作/核:
操作组 |
操作 |
Maths |
Add, Sub, Mul, Div, Exp, Log, Greater, Less, Equal |
Array |
Concat, Slice, Split, Constant, Rank, Shape, Shuffle |
Matrix |
MatMul, MatrixInverse, MatrixDeterminant |
Neuronal Network |
SoftMax, Sigmoid, ReLU, Convolution2D, MaxPool |
Checkpointing |
Save, Restore |
Queues and syncronizations |
Enqueue, Dequeue, MutexAcquire, MutexRelease |
Flow control |
Merge, Switch, Enter, Leave, NextIteration |
1 、算术操作
TensorFlow的算术操作如下:
操作 |
描述 |
tf.add(x, y, name=None) |
求和 |
tf.sub(x, y, name=None) |
减法 |
tf.mul(x, y, name=None) |
乘法 |
tf.div(x, y, name=None) |
除法 |
tf.mod(x, y, name=None) |
取模 |
tf.abs(x, name=None) |
求绝对值 |
tf.neg(x, name=None) |
取负 (y = -x). |
tf.sign(x, name=None) |
返回符号 y = sign(x) = -1 if x < 0; 0 if x == 0; 1 if x > 0. |
tf.inv(x, name=None) |
取反 |
tf.square(x, name=None) |
计算平方 (y = x * x = x^2). |
tf.round(x, name=None) |
舍入最接近的整数 |
tf.sqrt(x, name=None) |
开根号 (y = \sqrt{x} |
tf.pow(x, y, name=None) |
幂次方 |
tf.exp(x, name=None) |
计算e的次方 |
tf.log(x, name=None) |
计算log,一个输入计算e的ln,两输入以第二 输入为底 |
tf.maximum(x, y, name=None) |
返回最大值 (x > y ? x |
tf.minimum(x, y, name=None) |
返回最小值 (x < y ? x |
tf.cos(x, name=None) |
三角函数cosine |
tf.sin(x, name=None) |
三角函数sine |
tf.tan(x, name=None) |
三角函数tan |
tf.atan(x, name=None) |
三角函数ctan |
2、张量操作Tensor Transformations
2.1 数据类型转换Casting
操作 |
描述 |
tf.string_to_number |
字符串转为数字 |
tf.to_double(x, name=’ToDouble’) |
转为64位浮点类型–float64 |
tf.to_float(x, name=’ToFloat’) |
转为32位浮点类型–float32 |
tf.to_int32(x, name=’ToInt32’) |
转为32位整型–int32 |
tf.to_int64(x, name=’ToInt64’) |
转为64位整型–int64 |
tf.cast(x, dtype, name=None) |
将x或者x.values转换为dtype tf.int32 |
tf.equal(x, y, name=None) |
判断两个tensor是否每个元素都相等。 返回一个格式为bool的tensor A = [[1,3,4,5,6]],B = tf.equal(A, B) ==> [[ True True |
2.2 形状操作Shapes and Shaping
操作 |
描述 |
tf.shape(input, name=None) |
返回数据的shape |
tf.size(input, name=None) |
返回数据的元素数量 |
tf.rank(input, name=None) |
返回tensor的rank 来唯一表示任何一个元素 ndims” |
tf.reshape(tensor, shape, name=None) |
改变tensor的形状 至一维 |
tf.expand_dims(input, dim, name=None) |
插入维度1进入一个tensor中 <= dim <= input.dims() |
2.3 切片与合并(Slicing and Joining)
操作 |
描述 |
tf.slice(input_, begin, size, |
对tensor进行切片操作 for i in [0, n] [6, 6, 6]]] |
tf.split(split_dim, num_split, value, |
沿着某一维度将tensor分离为num_split |
tf.concat(concat_dim, values, |
沿着某一维度连结tensor [10, 11, 12]] 11, 12]] tensors]) |
tf.pack(values, axis=0, name=’pack’) |
将一系列rank-R的tensor打包为一个rank-(R+1)的 tensor |
tf.reverse(tensor, dims, name=None) |
沿着某维度进行序列反转 rank(tensor) #[ 8, 9, 10, 11]], |
tf.transpose(a, perm=None, |
调换tensor的维度顺序 |
tf.gather(params, indices, |
合并索引indices所指示params中的切片 |
tf.one_hot |
indices = [0, 2, -1, 1] |
3、矩阵相关运算
操作 |
描述 |
tf.diag(diagonal, name=None) |
返回一个给定对角值的对角tensor |
tf.diag_part(input, name=None) |
功能与上面相反 |
tf.trace(x, name=None) |
求一个2维tensor足迹,即对角值diagonal 之和 |
tf.transpose(a, perm=None, |
调换tensor的维度顺序 [3 6]] |
tf.matmul(a, b, |
矩阵相乘 |
tf.matrix_determinant(input, |
返回方阵的行列式 |
tf.matrix_inverse(input, adjoint=None, |
求方阵的逆矩阵,adjoint为True时,计算输入 共轭矩阵的逆矩阵 |
tf.cholesky(input, name=None) |
对输入方阵cholesky分解, L和其转置的乘积的分解A=LL^T |
tf.matrix_solve(matrix, rhs, |
求解tf.matrix_solve(matrix, name=None) [M,K],output为[M,K] |
4、复数操作
操作 |
描述 |
tf.complex(real, imag, name=None) |
将两实数转换为复数形式 [3.25 + 5.75j]] |
tf.complex_abs(x, name=None) |
计算复数的绝对值,即长度。 |
tf.conj(input, name=None) |
计算共轭复数 |
tf.imag(input, name=None) |
提取复数的虚部和实部 |
tf.fft(input, name=None) |
计算一维的离散傅里叶变换,输入数据类型为complex64 |
5、归约计算(Reduction)
操作 |
描述 |
tf.reduce_sum(input_tensor, |
计算输入tensor元素的和,或者安照reduction_indices 指定的轴进行求和 |
tf.reduce_prod(input_tensor, |
计算输入tensor元素的乘积,或者安照reduction_indices 指定的轴进行求乘积 |
tf.reduce_min(input_tensor, |
求tensor中最小值 |
tf.reduce_max(input_tensor, |
求tensor中最大值 |
tf.reduce_mean(input_tensor, |
求tensor中平均值 |
tf.reduce_all(input_tensor, |
对tensor中各个元素求逻辑’与’ |
tf.reduce_any(input_tensor, |
对tensor中各个元素求逻辑’或’ |
tf.accumulate_n(inputs, |
计算一系列tensor的和 |
tf.cumsum(x, axis=0, |
求累积和 c, c] [b + c, c, 0] |
6、分割(Segmentation)
操作 |
描述 |
tf.segment_sum(data, segment_ids, |
根据segment_ids的分段计算各个片段的和 tensor 求和,并放入结果的相应id中,且segment_ids只升不降 |
tf.segment_prod(data, segment_ids, |
根据segment_ids的分段计算各个片段的积 |
tf.segment_min(data, segment_ids, |
根据segment_ids的分段计算各个片段的最小值 |
tf.segment_max(data, segment_ids, |
根据segment_ids的分段计算各个片段的最大值 |
tf.segment_mean(data, segment_ids, |
根据segment_ids的分段计算各个片段的平均值 |
tf.unsorted_segment_sum(data, |
与tf.segment_sum函数类似, |
tf.sparse_segment_sum(data, |
输入进行稀疏分割求和 tf.constant([0, 0])) ==> [[0 0 |
7、序列比较与索引提取(Sequence Comparison and Indexing)
操作 |
描述 |
tf.argmin(input, dimension, name=None) |
返回input最小值的索引index |
tf.argmax(input, dimension, name=None) |
返回input最大值的索引index dimension指定轴方向 |
tf.listdiff(x, y, name=None) |
返回x,y中不同值的索引 |
tf.where(input, name=None) |
返回bool型tensor中为True的位置 |
tf.unique(x, name=None) |
返回一个元组tuple(y,idx),y为x的列表的唯一化数据列表, |
tf.invert_permutation(x, name=None) |
置换x数据与索引的关系 |
8、神经网络(Neural Network)
8.1 激活函数(Activation Functions)
操作 |
描述 |
tf.nn.relu(features, name=None) |
整流函数:max(features, |
tf.nn.relu6(features, name=None) |
以6为阈值的整流函数:min(max(features, |
tf.nn.elu(features, name=None) |
elu函数,exp(features) |
tf.nn.softplus(features, name=None) |
计算softplus:log(exp(features) |
tf.nn.dropout(x, keep_prob, |
计算dropout,keep_prob为keep概率 |
tf.nn.bias_add(value, bias, |
对value加一偏置量 |
tf.sigmoid(x, name=None) |
y = 1 / (1 + exp(-x)) |
tf.tanh(x, name=None) |
双曲线切线激活函数 |
8.2 卷积函数(Convolution)
操作 |
描述 |
tf.nn.conv2d(input, filter, strides, |
在给定的4D input与 filter下计算2D卷 积输入shape为 [batch, height, width, in_channels] |
tf.nn.conv3d(input, filter, strides, |
在给定的5D input与 filter下计算3D卷 积输入shape为 [batch, in_depth, in_height, in_width, in_channels] |
8.3 池化函数(Pooling)
操作 |
描述 |
tf.nn.avg_pool(value, ksize, strides, |
平均方式池化 |
tf.nn.max_pool(value, ksize, strides, |
最大值方法池化 |
tf.nn.max_pool_with_argmax(input, |
返回一个二维元组(output,argmax),最大值 pooling,返回最大值及其相应的索引 |
tf.nn.avg_pool3d(input, ksize, |
3D平均值pooling |
tf.nn.max_pool3d(input, ksize, |
3D最大值pooling |
8.4 数据标准化(Normalization)
操作 |
描述 |
tf.nn.l2_normalize(x, dim, |
对维度dim进行L2范式标准化 epsilon)) |
tf.nn.sufficient_statistics(x, axes, |
计算与均值和方差有关的完全统计量 *元素的平方和,*shift结果 |
tf.nn.normalize_moments(counts, |
基于完全统计量计算均值和方差 |
tf.nn.moments(x, axes, |
直接计算均值与方差 |
8.5 损失函数(Losses)
操作 |
描述 |
tf.nn.l2_loss(t, name=None) |
output = sum(t ** 2) / 2 |
8.6 分类函数(Classification)
操作 |
描述 |
tf.nn.sigmoid_cross_entropy_with_logits |
计算输入logits, |
tf.nn.softmax(logits, name=None) |
计算softmax sum_j(exp(logits[i, j])) |
tf.nn.log_softmax(logits, name=None) |
logsoftmax[i, j] = logits[i, j] – log(sum(exp(logits[i]))) |
tf.nn.softmax_cross_entropy_with_logits |
计算logits和labels的softmax交叉熵 |
tf.nn.sparse_softmax_cross_entropy_with_logits |
计算logits和labels的softmax交叉熵 |
tf.nn.weighted_cross_entropy_with_logits |
与sigmoid_cross_entropy_with_logits()相似, |
8.7 符号嵌入(Embeddings)
操作 |
描述 |
tf.nn.embedding_lookup |
根据索引ids查询embedding列表params 中的tensor值 strategy策略进行分割 方案为: 分配方案为: |
tf.nn.embedding_lookup_sparse(params, |
对给定的ids和权重查询embedding tensor权重,浮点类型,若为None, 则权重为全’1’ |
8.8 循环神经网络(Recurrent Neural Networks)
操作 |
描述 |
tf.nn.rnn(cell, inputs, |
基于RNNCell类的实例cell建立循环神经网络 |
tf.nn.dynamic_rnn(cell, inputs, |
基于RNNCell类的实例cell建立动态循环 神经网络 展开返回(outputs,state) |
tf.nn.state_saving_rnn(cell, inputs, |
可储存调试状态的RNN网络 |
tf.nn.bidirectional_rnn(cell_fw, |
双向RNN, 返回一个3元组tuple output_state_bw) |
— tf.nn.rnn简要介绍—
cell: 一个RNNCell实例
inputs: 一个shape为[batch_size, input_size]的tensor
initial_state: 为RNN的state设定初值,可选
sequence_length:制定输入的每一个序列的长度,size为[batch_size],值范围为[0, T)的int型数据
其中T为输入数据序列的长度
@
@针对输入batch中序列长度不同,所设置的动态计算机制
@对于在时间t,和batch的b行,有
(output, state)(b, t) = ? (zeros(cell.output_size), states(b,
sequence_length(b) - 1)) : cell(input(b, t), state(b, t - 1))
8.9 求值网络(Evaluation)
操作 |
描述 |
tf.nn.top_k(input, k=1, sorted=True, |
返回前k大的值及其对应的索引 |
tf.nn.in_top_k(predictions, targets, |
返回判断是否targets索引的predictions 相应的值是否在在predictions前k个位置 中,返回数据类型为bool类型,len与 predictions同 |
8.10 监督候选采样网络(Candidate Sampling)
对于有巨大量的多分类与多标签模型,如果使用全连接softmax将会占用大量的时间与空间资源,所以采用候选采样方法仅使用一小部分类别与标签作为监督以加速训练。
操作 |
描述 |
Sampled Loss Functions |
|
tf.nn.nce_loss(weights, biases, |
返回noise-contrastive的训练 损失结果 |
tf.nn.sampled_softmax_loss(weights, |
返回sampled |
Candidate Samplers |
|
tf.nn.uniform_candidate_sampler(true_classes, |
通过均匀分布的采样集合 浮点值 个数,为浮点值 |
tf.nn.log_uniform_candidate_sampler(true_classes, |
通过log均匀分布的采样集合, 返回三元tuple |
tf.nn.learned_unigram_candidate_sampler |
根据在训练过程中学习到的分布 状况进行采样 |
tf.nn.fixed_unigram_candidate_sampler(true_classes, |
基于所提供的基本分布进行采样 |
9、保存与恢复变量
操作 |
描述 |
类tf.train.Saver(Saving |
|
tf.train.Saver.__init__(var_list=None, |
创建一个存储器Saver |
tf.train.Saver.save(sess, save_path, |
保存变量 |
tf.train.Saver.restore(sess, |
恢复变量 |
tf.train.Saver.last_checkpoints |
列出最近未删除的checkpoint 文件名 |
tf.train.Saver.set_last_checkpoints(last_checkpoints) |
设置checkpoint文件名列表 |
tf.train.Saver.set_last_checkpoints_with_time(last_checkpoints_with_time) |
设置checkpoint文件名列表和时间戳 |
梯度计算
移动平均(Moving Averages)
一些训练优化算法,比如GradientDescent
和Momentum 在优化过程中便可以使用到移动平均方法。使用移动平均常常可以较明显地改善结果。
操作 |
描述 |
class |
将指数衰退加入到移动平均中 |
tf.train.ExponentialMovingAverage.apply(var_list=None) |
对var_list变量保持移动平均 |
tf.train.ExponentialMovingAverage.average_name(var) |
返回var均值的变量名称 |
tf.train.ExponentialMovingAverage.average(var) |
返回var均值变量 |
tf.train.ExponentialMovingAverage.variables_to_restore(moving_avg_variables=None) |
返回用于保存的变量名称的映射 |