Table of Contents
架构与设计
- 数据流图, 前向图和后向图, 前向和后向计算图是分开的
- 节点, 操作 operator: 数学运算
- 变量 Variable, 有内部状态
- 占位符 placeholder, 用于输入数据
- 梯度值
- 更新参数操作
- 更新后的参数
- 有向边:
- 数据边,传输数据
- 控制依赖,控制执行顺序
- 执行原理:
- 创建散列表,节点名字做key,入度做value
- 创建可执行节点队列, 将入度为0的节点放入队列并从散列表中删除
- 依次执行队列中的节点, 每次执行都将执行节点的输出指向的所有节点的入度减1, 更新到散列表中
- 重复2-3直到所有节点都计算完毕
- 数据载体: 张量
- Tensor, 张量实现的时候是通过句柄的方式, 实现复用, 通过引用计数实现内存释放.
- 属性:
name,dtype,graph,op,shape,value_index(张量在该前置操作中所有输出值中的索引) - 方法:
eval,get_shape,set_shape,consumers(张量的后置操作) - 创建,
tf.constant以及操作tf.add都可以创建张量 - 执行,
sess.run和tensorf.eval
- 属性:
- SparseTensor, 稀疏张量, 包含
indices(N, ndims),values(N),dense_shape(ndims) 三个属性- 创建,
tf.SparseTensor(indices=[[1],[3],[8]], values=[1,1,1], dense_shape=[10]) - 操作,
- 创建,
- Tensor, 张量实现的时候是通过句柄的方式, 实现复用, 通过引用计数实现内存释放.
- 模型载体: 操作
- 计算节点
- 属性:
name,type,inputs,control_inputs,outpus,device,graph,traceback(调用栈) - 典型操作
- 算术:
add,multiply,mod,sqrt,sin,trace,fft,argmin已及numpy类似的矩阵操作 - 数组:
size,rank,split,reverse,cast,one_hot,quantize - 梯度裁剪:
clip_by_value,clip_by_norm,clip_by_global_norm - 逻辑控制和调试:
identity,logical_and,equal,less,is_finite,is_nan - 数据流控制:
enqueue,dequeue,size,take_grad,apply_grad - 初始化操作:
zeros_initializer,random_normal_initializer,orthogonal_initializer - 神经网络操作:
convolution,pool,dropout - 随机运算:
random_normal,random_shuffle - 字符串运算:
string_to_hash_bucket,reduce_join,substr,encode_base64 - 图像处理:
encode_png,resize_images,rot90,hsv_to_rgb,adjust_gamma
- 算术:
- 属性:
- 存储节点: 变量
- 变量a其实由
(a),Assign,read,initial_value四个节点组成,tf.add(a, b)操作实际上读的是read子节点的值, 而tf.global_variables_initializer实际上是将initial_value传入Assign节点,实现初始化的 - 变量操作, 支持两种初始化
- 用户指定的初始值
- VariableDef, 用protobuff定义的变量初始化, 用于继续训练场景
- 变量a其实由
- 数据节点: Placeholder
tf.placeholder,tf.sparse_placeholder
- 计算节点
- 运行环境 : 会话
- 普通会话,
sess = tf.Session(), sess.run, sess.close - 通过
tf.ConfigProto设置会话配置, 包括但不限于, GPU使用, 分布式环境RPC地址 etc with语句可以不用指定session,就可以直接调用eval方法计算张量的值- 交互式会话
tf.InteractiveSession会默认的将eval的会话设置为当前会话 reset方法用于会话的资源释放
- 普通会话,
- 训练工具: 优化器
_use_locking在并发更新的时候是否加锁- 子类实现
_apply_dense和_apply_sparse方法, 这两个方法都返回数据流图上的操作 minimize方法调用compute_gradients和apply_gradients方法gate_gradients梯度计算的异步/同步控制- 更自由地控制优化过程
grads_and_vars = optimizer.compute_gradients(loss) for i, (g, v) in enumerate(grads_and_vars): if g is not None: grads_and_vars[i] = (tf.clip_by_norm(g, 5), v) # 裁剪梯度 train_op = optimizer.apply_gradients(grads_and_vars)
关键模块篇
数据处理方法
- 输入流水线
- 创建文件名列表
- python列表 或者
tf.train.match_filenames_once
- python列表 或者
- 创建文件名队列
tf.train.string_input_producer
- Reader 和 Decoder
- CSV文件,
tf.TextLineReader,tf.decode_csv - TFRecords 文件,
tf.TFRecordReader,tf.parse_single_example - 自由格式,
tf.FixedLengthRecordReader,tf.decode_raw
- CSV文件,
- 创建样本队列
- 使用
tf.train.start_queue_runners启动后台线程读取队列 - 使用后台线程协调器
tf.train.Coordinator管理线程 - 创建批量数据
tf.train.shuffle_batch
- 使用
- 创建文件名列表
- 模型参数
- 参数创建、初始化、更新
tf.Variable实现 - 模型文件存储和恢复
tf.train.Saver实现 - 初始化方法
tf.global_variables_initilizer和tf.variables_initilizer(var_list),var_list是变量集合, 创建变量时,可以通过collections参数指定不同的集合, 默认是GraphKeys.GLOBAL_VARIABLES, 即全局变量集合, 如果显式指定trainable=True,那么会加到TRAINABLE_VARABLES集合, 内置5类变量集合(最新版本支持更多了)GraphKeys.GLOBAL_VARIABLESGraphKeys.LOCAL_VARIABLESGraphKeys.TRAINABLE_VARABLESGraphKeys.MODEL_VARIABLESGraphKeys.MOVING_AVERAGE_VARIABLESGraphKeys.REGULARIZATION_LOSSES
- 更新模型参数
- 赋值,
tf.assign,tf.assign_add,tf.assign_sub, 注意等于号没法实现变量赋值, 它只是创建了一个新的张量, 并没有改变变量的值
- 赋值,
- 使用
tf.train.Saver保存和恢复模型saver = tf.train.Saver({'w' : W})要保存的模型, 通过变量名字来标示和恢复saver.restore
- 变量作用域
tf.variable_scope,reuse参数表明是否可以复用,initializer指定该变量作用域下统一的初始化方法
- 参数创建、初始化、更新
- 命令行参数
argparse和tf.app.flags, 后者的好处: 自动生成使用方法信息, 自动生成帮组信息, 自动生成错误信息
TensorFlow编程框架
- 显式创建数据流图
tf.Graph(),with tf.Graph().as_default()语句添加作用域 - ps-worker: 模型分发,参数更新由PS实现; 模型推断和梯度计算由worker实现
- 分布式模型脚本需要从命令行参数获取集群配置参数
tf.ClusterSpec,tf.train.Server- 同步的梯度更新比异步的更快?
- 同步训练: 梯度聚合器
- 异步训练: 靠内部的锁机制实现
- supervisor: 管理模型训练
- 定期保存模型到checkpoint
- 重启的时候从checkpoint文件恢复,继续训练
- 异常发生时,清理现场
- 执行步骤
- 创建Supervisor实例,传入checkpoint文件路径和日志路径
- 获取会话实例 session
- 检查点服务, 定期保存
- 汇总服务, 汇总日志, 追加到logdir
- 步数计数器
- 使用会话实例执行训练, 并检查停止条件
TensorBoard
tf.Summaryaudio,image,scalar,histogram,merge_allFileWriteradd_summary,add_event,add_graph
- 名字作用域与抽象节点, 抽象节点是一个子图, 通过name_scope可以将该scope下的所有节点自动汇聚到一个子图
- 汇总数据 summary.proto
- 折线图
tf.summary.scalar(name, tensor), 汇总操作都会放到KEY: GraphKeys.SUMMARIES 下 - 分布图
tf.summary.histogram(name, tensor) - 图像
tf.summary.image(name, tensor, max_outputs), tensor 是4阶张量 [batch_size, height, width, channels], channels 可取1(灰度图), 3(彩色图), 4(带Alpha通道的彩色图) - 音频
tf.summary.image(name, tensor, sample_rate, max_outputs)tensor 是3阶张量 [batch_size, frames, channels] 或者2阶张量 [batch_size, frames], frames是音频的值-1到1之间 https://magenta.tensorflow.org/ - 可视化高维数据, embeddings: 支持t-SNE和PCA两种降维方式
模型托管 Tensorflow Serving
- 流水线
- 持续训练, 即在线学习
- 模型服务, gRPC协议
- 客户端访问
- 自动感知模型更新