1、tensorflow的基本运作

为了快速的熟悉TensorFlow编程,下面从一段简单的代码开始:

  1. import tensorflow as tf
  2. #定义‘符号’变量,也称为占位符
  3. a = tf.placeholder("float")
  4. b = tf.placeholder("float")
  5. y = tf.mul(a, b) #构造一个op节点
  6. sess = tf.Session()#建立会话
  7. #运行会话,输入数据,并计算节点,同时打印结果
  8. print sess.run(y, feed_dict={a: 3, b: 3})
  9. # 任务完成, 关闭会话.
  10. sess.close()

其中tf.mul(a, b)函数便是tf的一个基本的算数运算,接下来介绍跟多的相关函数。

2、tf函数

  1. TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU GPU。一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测。如果检测到 GPU, TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作.
  2. 并行计算能让代价大的算法计算加速执行,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

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} = x^{1/2}).
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 : y)
tf.minimum(x, y, name=None) 返回最小值 (x < y ? x : y)
tf.cos(x, name=None) 三角函数cosine
tf.sin(x, name=None) 三角函数sine
tf.tan(x, name=None) 三角函数tan
tf.atan(x, name=None) 三角函数ctan

张量操作Tensor Transformations

  • 数据类型转换Casting | 操作 | 描述 | | —- | :—- | | tf.string_to_number | | | (string_tensor, out_type=None, name=None) | 字符串转为数字 | | 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 |
  • 形状操作Shapes and Shaping | 操作 | 描述 | | —- | :—- | | tf.shape(input, name=None) | 返回数据的shape | | tf.rank(input, name=None) | 返回tensor的rank 注意:此rank不同于矩阵的rank tensor的rank表示一个tensor需要的索引数目来唯一表示任何一个元素 也就是通常所说的 “order”, “degree”或”ndims” | | tf.reshape(tensor, shape, name=None) | 改变tensor的形状 | | tf.expand_dims(input, dim, name=None) | 插入维度1进入一个tensor中 #该操作要求-1-input.dims() |
  • 切片与合并(Slicing and Joining) | 操作 | 描述 | | —- | :—- | | tf.slice(input_, begin, size, name=None) | 对tensor进行切片操作 | | tf.split(split_dim, num_split, value, name=’split’) | 沿着某一维度将tensor分离为num_split tensors | | tf.concat(concat_dim, values, name=’concat’) | 沿着某一维度连结tensor | | tf.pack(values, axis=0, name=’pack’) | 将一系列rank-R的tensor打包为一个rank-(R+1)的tensor | | tf.reverse(tensor, dims, name=None) | 沿着某维度进行序列反转 其中dim为列表,元素为bool型,size等于rank(tensor) | | tf.transpose(a, perm=None, name=’transpose’) | 调换tensor的维度顺序, 按照列表perm的维度排列调换tensor顺序 | | tf.gather(params, indices, validate_indices=None, name=None) | 合并索引indices所指示params中的切片 | | tf.one_hot | one_hot |

矩阵相关运算

操作 描述
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, name=’transpose’) 调换tensor的维度顺序
tf.matmul(a, b, transpose_a=False, transpose_b=False, a_is_sparse=False, b_is_sparse=False, name=None) 矩阵相乘
tf.matrix_determinant(input, name=None) 返回方阵的行列式
tf.matrix_inverse(input, adjoint=None, name=None) 求方阵的逆矩阵,adjoint为True时,计算输入共轭矩阵的逆矩阵
tf.cholesky(input, name=None) 对输入方阵cholesky分解, 即把一个对称正定的矩阵表示成一个下三角矩阵L和其转置的乘积的分解A=LL^T
tf.matrix_solve(matrix, rhs, adjoint=None, name=None) 求解 matrix

复数操作

操作 描述
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

归约计算(Reduction)

操作 描述
tf.reduce_sum(input_tensor, reduction_indices=None,
keep_dims=False, name=None) 计算输入tensor元素的和,或者安照reduction_indices指定的轴进行求和
tf.reduce_prod(input_tensor, reduction_indices=None, keep_dims=False, name=None) 计算输入tensor元素的乘积,或者安照reduction_indices指定的轴进行求乘积
tf.reduce_min 求tensor中最小值
tf.reduce_max 求tensor中最大值
tf.reduce_mean 求tensor中平均值
tf.reduce_all 对tensor中各个元素求逻辑’与’
tf.reduce_any 对tensor中各个元素求逻辑’或’
tf.accumulate_n 计算一系列tensor的和
tf.cumsum 求累积和

分割(Segmentation)

操作 描述
tf.segment_sum(data, segment_ids, name=None) 根据segment_ids的分段计算各个片段的和
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 与tf.segment_sum函数类似, id顺序可以是无序的
tf.sparse_segment_sum 输入进行稀疏分割求和

序列比较与索引提取(Sequence Comparison and Indexing)

操作 描述
tf.argmin(input, dimension, name=None) 返回input最小值的索引index
tf.argmax(input, dimension, name=None) 返回input最大值的索引index
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数据与索引的关系

神经网络(Neural Network)

  • 激活函数(Activation Functions) | 操作 | 描述 | | —- | :—- | | tf.nn.relu(features, name=None) | 整流函数:max(features, 0) | | tf.nn.relu6(features, name=None) | 以6为阈值的整流函数:min(max(features, 0), 6) | | tf.nn.elu(features, name=None) | elu函数,exp(features) - 1 if < 0,否则features | | tf.nn.softplus(features, name=None) | 计算softplus:log(exp(features) + 1) | | tf.nn.dropout | 计算dropout,keep_prob为keep概率 noise_shape为噪声的shape | | tf.nn.bias_add | 对value加一偏置量, 此函数为tf.add的特殊情况,bias仅为一维 | | tf.sigmoid(x, name=None) | y = 1 / (1 + exp(-x)) | | tf.tanh(x, name=None) | 双曲线切线激活函数 |
  • 卷积函数(Convolution) | 操作 | 描述 | | —- | :—- | | tf.nn.conv2d | 在给定的4D input与 filter下计算2D卷积, 输入shape为 [batch, height, width, in_channels] | | tf.nn.conv3d | 在给定的5D input与 filter下计算3D卷积, 输入shape为[batch, in_depth, in_height, in_width, in_channels] |
  • 池化函数(Pooling) | 操作 | 描述 | | —- | :—- | | tf.nn.avg_pool(value, ksize, strides, padding, data_format=’NHWC’, name=None) | 平均方式池化 | | tf.nn.max_pool(value, ksize, strides, padding, data_format=’NHWC’, name=None) | 最大值方法池化 | | tf.nn.max_pool_with_argmax | 返回一个二维元组(output,argmax),最大值pooling,返回最大值及其相应的索引 | | tf.nn.avg_pool3d(input, ksize, strides, padding, name=None) | 3D平均值pooling | | tf.nn.max_pool3d(input, ksize, strides, padding, name=None) | 3D最大值pooling |
  • 数据标准化(Normalization) | 操作 | 描述 | | —- | :—- | | tf.nn.l2normalize(x, dim, epsilon=1e-12, name=None) | 对维度dim进行L2范式标准化, output = x / sqrt(max(sum(x**2), epsilon)) | | tf.nn.sufficient_statistics(x, axes, shift=None, keep_dims=False, name=None) | 计算与均值和方差有关的完全统计量返回4维元组,元素个数,元素总和,元素的平方和,_shift结果 | | tf.nn.normalize_moments(counts, mean_ss, variance_ss, shift, name=None) | 基于完全统计量计算均值和方差 | | tf.nn.moments(x, axes, shift=None, name=None, keep_dims=False) | 直接计算均值与方差 |
  • 损失函数(Losses) | 操作 | 描述 | | —- | :—- | | tf.nn.l2_loss(t, name=None) | output = sum(t ** 2) / 2 |
  • 分类函数(Classification) | 操作 | 描述 | | —- | :—- | | tf.nn.sigmoid_cross_entropy_with_logits(logits, targets, name=None)* | 计算输入logits, targets的交叉熵 | | tf.nn.softmax(logits, name=None) | 计算softmaxsoftmax[i, j] = exp(logits[i, j]) / 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, name=None) | 计算logits和labels的softmax交叉熵logits, labels必须为相同的shape与数据类型 | | tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name=None) | 计算logits和labels的softmax交叉熵 | | tf.nn.weighted_cross_entropy_with_logits | 与sigmoid_cross_entropy_with_logits()相似,但给正向样本损失加了权重pos_weight |
  • 符号嵌入(Embeddings) | 操作 | 描述 | | —- | :—- | | tf.nn.embedding_lookup(params, ids, partition_strategy=’mod’, name=None, validate_indices=True) | 根据索引ids查询embedding列表params中的tensor值 | | tf.nn.embedding_lookup_sparse | 对给定的ids和权重查询embedding |
  • 循环神经网络(Recurrent Neural Networks) | 操作 | 描述 | | —- | :—- | | tf.nn.rnn(cell, inputs, initial_state=None, dtype=None, | | | sequence_length=None, scope=None) | 基于RNNCell类的实例cell建立循环神经网络 | | tf.nn.dynamic_rnn | 基于RNNCell类的实例cell建立动态循环神经网络,与一般rnn不同的是,该函数会根据输入动态展开返回(outputs,state) | | tf.nn.state_saving_rnn | 可储存调试状态的RNN网络 | | tf.nn.bidirectional_rnn | 双向RNN, 返回一个3元组tuple(outputs, output_state_fw, 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))


  • 求值网络(Evaluation) | 操作 | 描述 | | —- | :—- | | tf.nn.top_k(input, k=1, sorted=True, name=None) | 返回前k大的值及其对应的索引 | | tf.nn.in_top_k(predictions, targets, k, name=None) | 返回判断是否targets索引的predictions相应的值是否在在predictions前k个位置中,返回bool类型,len与predictions同 |

对于有巨大量的多分类与多标签模型,如果使用全连接softmax将会占用大量的时间与空间资源,所以采用候选采样方法仅使用一小部分类别与标签作为监督以加速训练。

操作 描述
Sampled Loss Functions
tf.nn.nce_loss 返回noise-contrastive的训练损失结果
tf.nn.sampled_softmax_loss 返回sampled softmax的训练损失
Candidate Samplers
tf.nn.uniform_candidate_sampler 通过均匀分布的采样集合返回三元tuple
tf.nn.log_uniform_candidate_sampler 通过log均匀分布的采样集合,返回三元tuple
tf.nn.learned_unigram_candidate_sampler 根据在训练过程中学习到的分布状况进行采样 返回三元tuple
tf.nn.fixed_unigram_candidate_sampler 基于所提供的基本分布进行采样

保存与恢复变量

操作 描述
类tf.train.Saver(Saving and Restoring Variables)
tf.train.Saver 创建一个存储器Saver var_list定义需要存储和恢复的变量
tf.train.Saver.save 保存变量
tf.train.Saver.restore(sess, save_path) 恢复变量
tf.train.Saver.last_checkpoints 列出最近未删除的checkpoint 文件名
tf.train.Saver.set_last_checkpoints 设置checkpoint文件名列表
tf.train.Saver.set_last_checkpoints_with_time 设置checkpoint文件名列表和时间戳