TensorFlow
- 安装
1 | pip install tensorflow==1.12 -i https://mirrors.aliyun.com/pypi/simple |
TensorFlow结构分析
TensorFlow程序通常被组织成一个构建图阶段和一个执行图阶段
构建阶段:数据与操作的执行步骤被描述成一个图
执行阶段:使用会话执行构建好的图中的操作
图和会话:
- 图(graph):这是TensorFlow将计算表示为指令之间的依赖关系的一种表示法
- 会话(session):TensorFlow跨一个或多个本地或远程设备运行数据流图的机制
张量(Tensor):TensorFlow中的基本数据对象
节点(operation):提供图当中执行的操作
图与TensorBoard
什么是图结构
图包含了一组tf.Operation代表的计算单元对象和tf.Tensor代表的计算单元之间流动的数据。
1 | import tensorflow as tf |
TensorBoard:可视化工具
TensorFlow可用于训练大规模深度神经网络,所需要的计算次数、时间往往都很长,而为了方便对TensorFlow程序的调试和优化,TensorFlow提供了TensorBoard可视化工具
开启TensorBoard步骤
- TensorBoard通过读取TensorFLow的事件文件来运行,需要将数据生成一个序列化的Summary protobuf对象
1
tf.summary.FileWriter('/tmp/summary/', graph=sess.graph)
- 在这个指定的目录下会生一个event文件,器格式名如下
1
events.out.tfevents.{timestamp}.{hostname}
- 启动TensorBoard
1
tensorboard --logdir="/tmp/summary/"
- 然后再浏览器中打开127.0.0.1:6006,就能看到TensorBoard网页了
收集其他变量
- 收集0维值
- tf.summary.scalar(“变量名”,变量)
- 收集高维值
- tf.summary.histogram(“变量名”,变量)
- 整合结果
- merge = tf.summary.merge_all()
- 获取值
- sum_mary = sess.run(merge)
- 写入值
- filewriter.add_summary(sum_mary,i)
- 收集0维值
OP
OP是一个操作对象(Operation),是TensorFlow图中的一个节点,可以接收0个或多个输入Tensor,并且可以输出0个或多个Tensor,Operation对象是通过op构造函数(tf.add())创建的。
OP运算包括下面这些:
类型 | 实例 |
---|---|
标量运算 | add,sub,mul,div,exp,log,greater,less,equal |
向量运算 | concat,slice,splot,constant,rank,shape,shuffle |
矩阵运算 | matmul,matrixinverse,matrixdateminant |
带状态运算 | Variable,assgin,assginadd |
神经网络组件 | softmax,singmoid,relu,convolution,max_pool |
存储、恢复 | Save,Restroe |
队列及同步运算 | Enqueue,Dequeue,MutexAcquire,MutexRelease |
控制流 | Merge,Switch,Enter,Leave,Nextlteration |
会话
一个运行TensorFlow operation的类,会话包含以下两种开启方式
- tf.Session:用于完整的程序中
- tf.InteractiveSession:用于交互式上下文中的TensorFlow,例如shell
tf.Session(target=””,graph=None,config=None)
- target:如果将次参数留空(默认设置),会话将仅使用本地计算机设备,也可以指定远程设备。
- graph:默认情况下,绑定当前程序的默认图
- config:此参数允许您指定一个 tf.ConfigProto 以便控制会话的行为。例如,ConfigProto协议用于打印设备使用信息
run(fetches,feed_dict=None,options=None,run_metadata=None)
- 通过sess.run()来运行operation;多个以列表输入,返回结果也是多个
- fetches:一个或多个operation;多个以列表输入,返回结果也是多个
- feed_dict:参数允许调用者覆盖图中张量的值,运行时赋值
- 与tf.placeholder搭配使用,会检查值得形状是否与占位符兼容
1 | import tensorflow as tf |
张量
TensorFlow的张量就时一个n维数组,类型维tf.Tensor。Tensor具有两个重要的属性
- type:数据类型
- shape:形状
创建张量
创建固定值张量
- tf.zeros(shape,dtype=tf.float32,name=None)
- 创建一个shape形状,类型为tf.float32,值全为0的张量
- tf.zeros_like(tensor)
- 根据已有tensor类型、形状,创建一个全为0的张量
- tf.ones(shape,dtype=tf.float32,name=None)
- 创建一个shape形状,类型为tf.float32,值全为1的张量
- tf.ones_like(tensor)
- 根据已有tensor类型、形状,创建一个全为1的张量
- tf.fill(shape,value,name=None)
- 创建一个形状为shape,值为value的张量
- tf.constant(value,dtype=None,shape=None,name=”Const”)
- 创建一个常数张量
创建随机张量
- tf.random_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float32)
- 从标准正太分布随机输出值,构成一个shape形状的矩阵
张量的变换
类型改变
- tf.cast(tensor,dtype,name=None)
- tensor:输入的tensor,
- dtype:转换后的tensor类型
- tf.cast(tensor,dtype,name=None)
形状改变
- 静态形状改变:只能更改还没有定义的形状如tf.placeholder(tf.float32,shape=[None,None])
- tensor.set_shape(shape)
- 动态形状改变:可以改变tensor的形状,但是改变之后的元素总数得相同
- tf.reshape(tensor,shape)
- 静态形状改变:只能更改还没有定义的形状如tf.placeholder(tf.float32,shape=[None,None])
张量的运算
1 | import tensorflow as tf |
变量OP
tf.Variable(initial_value=None,trainable=True,collections=None,name=None)
- initial_value:初始化的值
- trainable:是否被训练
- collections:新变量将添加到列出的图的集合中collections,默认为[GraphKeys.GLOBAL_VARIABLES],如果trainable是True变量也添加到图形集合GraphKeys.TRAINABLE_VARIABLES
- 特点:该变量可以存储到硬盘上;可以修改值,可以指定被训练
- 变量需要显式初始化,才能运行值
1 | def variable_demo(): |
使用tf.variable_scope()修改变量的命名空间
1 | with tf.variable_scope("name"): |
模型保存于加载
1 | # 创建实例 |
常用api
1 | parameter = model.get_layer(i).get_weights()# 获取该模型第i层的权重 |
分布式训练
1 | tf.debugging.set_log_device_placement(True) #打印信息的显示某个变量在哪个设备上设置为True |
分布式策略
MirroredStrategy
- 进行的是同步式分布式训练
- 适用于一机多卡的情况
- 数据并行:
- Batch数据切分成N份分发给每个GPU
- 然后聚合梯度后来更新每个GPU的参数
- 缺点:更新一轮的速度取决于最慢的gpu
1 | strategy = tf.distribute.MirroredStrategy() |
CentralStorageStrategy
- MirroredStrategy的一个变种
- 把模型参数只单独存储在一CPU上(如果只有一快GPU将存储在GPU上)
- 其他还是一样的
MultiworkerMirroredStrtrgy
- 类似于MirroredStrategy
- 适用于多机多卡的形式
1 |
TPUStrategy
- 类似于MirroredStrategy
- 针对TPU的一种策略
ParameterServerStrategy
- 异步分布式
- 更加适用于大规模分布式系统
- 机器分为Parameter Server和worker两类
- Parameter Server:负责整合梯度更新参数,更新参数
- worker:负责计算梯度,训练网络
同步与异步的优劣
- 多机多卡
- 异步可以避免短板效应
- 一机多卡
- 同步可以避免过多的通信
- 异步计算会增加模型的泛化能力
- 异步不是严格正确的,所以模型更容忍错误
ParameterServerStrategy
定义ps节点
1 | # tf2.0需先配置cluster_resolver(即TF_CONFIG),否则报错 |
定义调度节点
1 | # tf2.0需先配置cluster_resolver(即TF_CONFIG),否则报错 |
定义计算节点
1 | # tf2.0需先配置cluster_resolver(即TF_CONFIG),否则报错 |
定义模型
1 | LEARNING_RATE = 1e-3 |
定义步数
1 | #定义多少步保存模型,多少步打印日志信息等,注意,分布式训练关键在于-train_distribute=strategy |
启动
1 | tf.estimator.train_and_evaluate( |
tf_serving
修改源码编译运行
1 | 拉取编译环境latest-devel,也可以是对应版本的 |
把模型保存为bp格式
1 | tf.keras.models.save_model(model, |
启动docker
1 | 8501为http,8500为grpc |
查看模型输入结构
1 | (test) bufan@bufandeMacBook-Pro tf_serving_model % saved_model_cli show --dir ./hert_model/1 --all |
拼出curl
1 | curl -X POST -i 'http://127.0.0.1:8501/v1/models/heart_model:predict' --data ' |
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 zoubinbf@163.com