TensorFlow学习日记5
来源:互联网 发布:什么是模块化编程 编辑:程序博客网 时间:2024/05/23 11:32
1. TensorFlow可视化
TensorFlow的工作方式是启动一个Web服务,该服务进程从TensorFlow程序执行所得的事件日志文件(event files)
中读取概要(summary)数据,然后将数据在网页中绘制成可视化的图标。概要数据包括几种类别,如下所示:
(1)标量数据:比如准确率、代价损失值,使用tf.summary.scalar加入记录算子。
(2)参数数据:比如参数矩阵weights、偏置矩阵bias,一般使用tf.summary.histogram记录。
(3)图像数据:用tf.summary.image加入记录算子。
(4)音频数据:用tf.summary.audio加入记录算子。
(5)计算图结构:在定义tf.summary.FileWriter对象时自动记录。
完整的框架代码,如下所示:
with tf.name_scope('input'): # create symbolic variables X = tf.placeholder(tf.float32, shape=[None, 6]) y_true = tf.placeholder(tf.float32, shape=[None, 6])with tf.name_scope('classifier'): weights = tf.Variables(tf.random_normal([6, 2])) bias = tf.Variable(tf.zeros([2])) y_pred = tf.nn.softmax(tf.matmul(X, weights) + bias) tf.summary.histogram('weights', weights) tf.summary.histogram('bias', bias) with tf.name_scope('cost'): cross_entropy = -tf.reduce_mean(y_true * tf.log(y_pred + 1e-10), reduction_indices=1) cost = tf.reduce_mean(cross_entropy) tf.summary.scalar('loss', cost) train_op = tf.train.GradientDescentOptimizer(0.001).minimize(cost)with tf.name_scope('accuracy'): correct_pred = tf.equal(tf.arg_max(y_true, 1), tf.arg_max(y_pred, 1)) acc_op = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) tf.summary.scalar('accuracy', acc_op) with tf.Session() as sess: writer = tf.summary.FileWriter('./logs', sess.graph) merged = tf.summary.merge_all() for step in range(max_step): ... summary, accuracy = sess.run([merged, acc_op], feed_dict={X:X_val, y_true:y_val}) writer.add_summary(summary, step)
2. tf.summary.merge_all
解析:记录概要的节点由于没有被任何计算节点所依赖,所以并不会自动执行,需要手动通过Session.run()接口触
发,为了编码简便,tf.summary.merge_all可以将所有概要操作合并成一个算子,其执行的结果是经过protocol buffer
序列化后的tf.Summary对象。生成的事件日志是一个以"events."开头的文件,因为内容是二进制数据,所以只能通过
TensorBoard打开。
3. 启动TensorBoard服务
解析:tensorboard --logdir=path/to/log-directory
(1)--logdir:tf.summary.FileWriter写入事件日志文件的目录路径。如果指定的目录下有多个子目录,TensorBoard
会把它们当作多次执行的记录,可以并行展示出来。这一般是在多次运行,比较不同参数的效果时使用。
(2)--port:设置服务端口,默认端口为6006.
(3)--event_file:指定某一个特定的事件日志文件。
(4)--reload_interval:服务后台重新加载数据的间隔,默认为120秒。
说明:TensorBoard是一个完整的Python应用,通过命令行启动Web。
4. TFRecord
解析:将普通的数据转换成TFRecord格式的文件,只需要写一个小程序,将每一条样本组装成protocol buffer定义的
Example结构的对象,序列化成字符串,再由tf.python_io.TFRecordWriter写入文件即可。
(1)将CSV文件转换为TFRecord文件
import pandas as pdimport tensorflow as tf# convert train.csv to train.tfrecordsdef transform_to_tfrecord(): data = pd.read_csv('data/train.csv') tfrecord_file = 'train.tfrecords' def int_feature(value): return tf.train.Feature( int64_list=tf.train.Int64List(value=[value])) def float_feature(value): return tf.train.Feature( float_list=tf.train.FloatList(value=[value])) writer = tf.python_io.TFRecordWriter(tfrecord_file) for i in range(len(data)): features = tf.train.Features(feature={ 'Age': float_feature(data['Age'][i]), 'Survived': int_feature(data['Survived'][i]), 'Pclass': int_feature(data['Pclass'][i]), 'Parch': int_feature(data['Parch'][i]), 'SibSp': int_feature(data['SibSp'][i]), 'Sex': int_feature(1 if data['Sex'][i] == 'male' else 0), 'Fare': float_feature(data['Fare'][i]) }) example = tf.train.Example(features=features) writer.write(example.SerializeToString()) writer.close()if __name__ == '__main__': transform_to_tfrecord()(2)读取TFRecord文件
import tensorflow as tfdef read_and_decode(train_files, num_threads=2, num_epochs=100, batch_size=10, min_after_dequeue=10): # read data from trainFile with TFRecord format reader = tf.TFRecordReader() filename_queue = tf.train.string_input_producer( train_files, num_epochs=num_epochs) _, serialized_example = reader.read(filename_queue) featuresdict = tf.parse_single_example( serialized_example, features={ 'Survived': tf.FixedLenFeature([], tf.int64), 'Pclass': tf.FixedLenFeature([], tf.int64), 'Parch': tf.FixedLenFeature([], tf.int64), 'SibSp': tf.FixedLenFeature([], tf.int64), 'Sex': tf.FixedLenFeature([], tf.int64), 'Age': tf.FixedLenFeature([], tf.float32), 'Fare': tf.FixedLenFeature([], tf.float32)}) # decode features to same format of float32 labels = featuresdict.pop('Survived') features = [tf.cast(value, tf.float32) for value in featuresdict.values()] # get data with shuffle batch and return features, labels = tf.train.shuffle_batch( [features, labels], batch_size=batch_size, num_threads=num_threads, capacity=min_after_dequeue + 3 * batch_size, min_after_dequeue=min_after_dequeue) return features, labelsdef train_with_queuerunner(): x, y = read_and_decode(['train.tfrecords']) with tf.Session() as sess: tf.group(tf.global_variables_initializer(), tf.local_variables_initializer()).run() coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=sess, coord=coord) try: step = 0 while not coord.should_stop(): # Run training steps or whatever features, lables = sess.run([x, y]) if step % 100 == 0: print('step %d:' % step, lables) step += 1 except tf.errors.OutOfRangeError: print('Done training -- epoch limit reached') finally: # When done, ask the threads to stop. coord.request_stop() # Wait for threads to finish. coord.join(threads)if __name__ == '__main__': train_with_queuerunner()
5. SkFlow,TFLearn,TF-Slim
解析:
(1)SkFlow:TensorFlow官方推出的仿照Scikit-Learn设计的高级API。现已与TensorFlow项目完全集成,称为
TensorFlow中的一个包tf.contrib.learn。
(2)TFLearn:构建在TensorFlow上的高层次API,目的是便于快速搭建试验环境,同时保持对TensorFlow的完
全透明和兼容性。
(3)TF-Slim:TensorFlow官方推出的一个轻量级的高级接口库,使用这个库可以让复杂模型的定义、训练、评估都
变得简单。TF-Slim在图像模型方面有较大的优势,它包含了很多新的层(比如Atrous卷积层)和新的评估标准(比如
mAP,IoU),还内置了AlexNet、inception、VGGNet、OverFeat、ResNets在内的各种经典图像识别模型。
6. RDMA(Remote Direct Memory Access)
解析:RDMA(Remote Direct Memory Access)技术全称远程直接数据存取,就是为了解决网络传输中服务器端数
据处理的延迟而产生的。RDMA通过网络把资料直接传入计算机的存储区,将数据从一个系统快速移动到远程系统存
储器中,而不对操作系统造成任何影响,这样就不需要用到多少计算机的处理功能。它消除了外部存储器复制和文本
交换操作,因而能解放内存带宽和CPU周期用于改进应用系统性能。
7. gRPC协议 [2]
解析:A high performance, open-source universal RPC framework.
8. Tensorflow源码目录
解析:
(1)public: API接口头文件目录,用于外部接口调用的API定义,主要是session.h和tensor_c_api.h。
(2)client: API接口实现文件目录。
(3)platform: OS系统相关接口文件,如file system,env等。
(4)protobuf: 均为.proto文件,用于数据传输时的结构序列化。
(5)common_runtime: 公共运行库,包含session,executor,threadpool,rendezvous,memory管理,设备分配
算法等。
(6)distributed_runtime: 分布式执行模块,如rpc session,rpc master,rpc worker,graph manager。
(7)framework: 包含基础功能模块,如log,memory,tensor。
(8)graph: 计算流图相关操作,如construct,partition,optimize,execute等。
(9)kernels: 核心Op,如matmul,conv2d,argmax,batch_norm等。
(10)lib: 公共基础库,如gif、gtl(google模板库)、hash、histogram等。
(11)ops: 基本ops运算,ops梯度运算,io相关的ops,控制流和数据流操作。
(12)Tensorflow/stream_executor目录是并行计算框架,由google stream executor团队开发。
(13)Tensorflow/contrib目录是contributor开发目录。
(14)Tensroflow/python目录是python API客户端脚本。
(15)Tensorflow/tensorboard目录是可视化分析工具,不仅可以模型可视化,还可以监控模型参数变化。
(16)third_party目录是TF第三方依赖库。
(17)eigen3: eigen矩阵运算库,TF基础ops调用。
(18)gpus: 封装了cuda/cudnn编程库。
9. tf.train.Server.create_local_server
解析:在本地创建一个单进程集群,该集群中的服务默认为启动状态。
10. TensorFlow多GPU并行
解析:TensorFlow中的并行主要分为模型并行和数据并行,如下所示:
(1)模型并行需要根据不同模型设计不同的并行方式,主要原理将模型中不同计算节点放在不同硬件资源上运算。
(2)同步数据并行,即等待所有GPU都计算完一个batch数据的梯度后,再统一将多个梯度合在一起,并更新共享的
模型参数。异步数据并行,即不等待所有GPU都完成一次训练,而是哪个GPU完成了训练,就立即将梯度更新到共享
的模型参数中。通常来说,同步的数据并行比异步的模式收敛速度更快,模型的精度更高。
11. TensorFlow分布式并行
解析:
(1)TensorFlow的分布式并行基于gRPC通信框架,其中包括一个master负责创建Session,还有多个worker负责执
行计算图中的任务。需要先创建一个TensorFlow Cluster对象,它包含一组task(每个task一般是一台单独的机器)用
来分布式地执行TensorFlow的计算图。
(2)一个Cluster可以切分为多个job,一个job是指一类特定的任务,比如parameter server (ps),worker,每一个job
里可以包含多个task。需要为每一个task创建一个server,然后连接到Cluster上,通常每个task会执行在不同的机器
上,然后也可以一台机器上执行多个task(控制不同的GPU)。
(3)Cluster对象通过tf.train.ClusterSpec来初始化,初始化信息是一个Python的Dict,比如tf.train.ClusterSpec({"ps":
["192.168.233.201:2222"], "worker":["192.168.233.202:2222","192.168.233.203:2222"]}),这代表设置了一个
parameter server和两个worker,分别在三台不同机器上。
(4)对每个task,需要给它定义自己的身份,比如对这个ps将设置server=tf.train.Server(cluster, job, name="ps",
task_index=0),将这台机器的job定义为ps,并且是ps中的第0台机器。此外,通过在程序中使用诸如with
tf.device("job:worker/task:7")可以限定Variable存放在哪个task或哪台机器上。
说明:TensorFlow的分布式有几种模式,比如In-graph replication模型并行,将模型的计算图的不同部分放在不同机
器上执行;而Between-graph replication则数据并行,每台机器使用完全相同的计算图,但是计算不同的batch数据。
12. TensorFlow同步和异步数据并行
解析:
(1)TensorFlow同步数据并行
同步训练为TensorFlow上每个节点上的任务需要读入共享参数,执行并行化的梯度计算,然后将所有共享参数进行合
并,如下所示:
(2)TensorFlow异步数据并行
异步训练即TensorFlow上每个节点上的任务为独立训练方式,不需要执行协调操作,如下所示:
13. TensorFlow日志等级
解析:TensorFlow有5个等级的log,以严重性最小到最大排列,它们是DEBUG、INFO、WARN、ERROR以及
FATAL。当选择好log等级后,只有那个等级和更严重等级的log会被打印出来。
14. TF.Contrib组件
解析:
(1)TF.contrib.distributions:统计分布。
(2)TF.contrib.layers:深度学习层。
(3)TF.contrib.losses:机器学习损失函数。
(4)性能分析器tfprof:分析模型的架构及衡量系统的性能。
15. TensorFlow容错机制
解析:TensorFlow有两种检测错误的机制,一种是基于发送和接收算子之间传输的错误信息,另一种是master进程的
轮询检查。当发现错误后,系统会终止当前迭代,从存档状态重新运行。
参考文献:
[1] 深度学习原理与TensorFlow实战
[2] gRPC:https://grpc.io/
- TensorFlow学习日记5
- TensorFlow学习日记1
- TensorFlow学习日记2
- TensorFlow学习日记3
- TensorFlow学习日记4
- TensorFlow学习日记6
- TensorFlow学习日记7
- TensorFlow学习日记8
- TensorFlow学习日记10
- TensorFlow学习日记11
- TensorFlow学习日记12
- TensorFlow学习日记13
- TensorFlow学习日记14
- TensorFlow学习日记15
- TensorFlow学习日记16
- TensorFlow学习日记17
- TensorFlow学习日记18
- TensorFlow学习日记19
- Hadoop
- 如何用JMeter对MySQL数据库进行压测?
- 7.18 思考关于意志力
- POJ-2031 最小生成树(prim算法)
- Spark JobServer实例以及上传运行
- TensorFlow学习日记5
- 属性动画的使用实例
- OOA、OOD、OOP 代表什么
- python中的self
- Hadoop
- uva11400--Lighting System Design DP
- Command /usr/bin/codesign failed with exit code 1
- 注释
- Hadoop-Streaming(流)