IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 《深入了解TensorFlow》笔记——Chapter 6.2 可视化数据流图 -> 正文阅读

[人工智能]《深入了解TensorFlow》笔记——Chapter 6.2 可视化数据流图

名字作用域和抽象节点

抽象节点,它不是一个具体的操作,而是代表一组特定操作的集合。将同一层网络或具有相同功能的操作整合为一个抽象节点,以简化数据流图的网络结构。

虽然ANN模型非常简单,但是如果不做任何处理直接可视化,它的graph仍然稍显复杂。如果进一步可视化深度神经网络,可能就会陷入节点间的复杂网络惋惜,难以迅速定位graph结构问题。因此,针对可视化深度神经网络的场景,我们应该尽可能的使用抽象节点整合相同的网络层或功能模块。抽象节点是graph上的subgraph,其内部展开后没有丢失节点间的拓扑关系。

一般使用名字作用域定义graph上抽象节点。相比于只作用于存储节点的变量作用域,名字作用域更通用,因为他对计算、存储和数据节点都有效。同一名字作用域下的所有节点集成相同的名字前缀,在graph上体现为该作用域下的所有节点都汇聚成一个抽象节点。

示例代码:

x = tf.placeholder(tf.float32, [None, 784])
with tf.name_scope('layer1'):
	w1 = tf.Variable(tf.random_normal([784, 1024]), 'weight1')
	b1 = tf.Variable(tf.zeros[1024], name='bias1')
	y1 = tf.nn.relu(tf.matmul(x, w1) + b1

此外name_scope还支持多层嵌套,例如

x = tf.placeholder(tf.float32, [None, 784])
with tf.name_scope('layer1'):
	with tf.name_scope('weight'):
		w1 = tf.Variable(tf.random_normal([784, 1024]), 'weight1')
	with tf.name_scope('bias'):
		b1 = tf.Variable(tf.zeros[1024], name='bias1')
	with tf.name_scop('activation'):
		y1 = tf.nn.relu(tf.matmul(x, w1) + b1

可视化数据流图示例

以MNIST softmax模型为例,介绍使用TB可视化其数据流图的步骤和方法。

可视化数据流图可分为以下三个步骤:

  1. 创建graph
    创建graph,并使用name_scope将同一层网络或相同功能模块的节点应以为同一个抽象节点,如输入模块、softmax网络层、交叉熵、优化器和评估指标。同时,对于同一个抽象内部包含多个节点的情况,可以嵌套name_scope,使得graph的网络结构更加清晰。
    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    import tensorflow as tf
    
    from tensorflow.examples.tutorials.mnist import input_data
    
    def model(lr=0.01):
    	with tf.name_scope('input'):
    		x = tf.placeholder(tf.float32, [None, 784], name='x')
    		gt = tf.placeholder(tf.float32, [None, 10], name='ground-truth')
    	with tf.name_scope('layer1'):
    		with tf.name_scope('weight'):
    			w1 = tf.Variable(tf.random_normal([784, 1024]))
    		with tf.name_scope('bias'):
    			b1 = tf.Variable(tf.zeros([1024])
    		with tf.name_scope('output'):
    			y1 = tf.nn.relu(tf.matmul(x, w1) + b1)
    	with tf.name_scope('layer2'):
    		with tf.name_scope('weight'):
    			w2 = tf.Variable(tf.random_normal([1024, 10])
    		with tf.name_scope('bias'):
    			b2 = tf.Variable(tf.zeros([10])
    		with tf.name_scope('output'):
    			y2 = tf.nn.softmax(tf.matmul(y1, w2) + b2)
    	with tf.name_scope('cross_entropy'):
    		loss = -tf.reduce_sum(gt * tf.log(tf.clip_by_value(y2, 1e-10, 1.0)))	
    		tf.summary.scalar('loss', loss)
    	with tf.name_scope('train'):
    		optimizer = tf.train.AdamOptimizer(lr)
    		train_ops = optimizer.minimize(loss)
    	with tf.name_scope('metric'):
    		with tf.name_scope('correct_prediction'):
    			correct_prediction = tf.equal(tf.argmax(y2, 1), tf.argmax(gt, 1))
    		with tf.name_scope('accuracy'):
    			accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)
    	  return x, gt, train_ops, accuracy
    
  2. 创建FileWriter
    先将上一步创建的graph写入event file。FileWriter构造方法的第一个参数logdir是必须设置的,他表示FileWriter实例创建的event file的目录。由于同一个模型可能训练多次,FileWriter会自动为每次训练创建各自的事件文件。当我们向FileWriter实例的构造方法传入graph时,他也会自动将graph写入evnet file中。
    示例代码如下:
with tf.Session() as sess:
	writer = tf.summary.FileWriter('/tmp/log', sess.graph)
	# init gloabl variables
	tf.global_variables_initializer().run()
	...
	# close FileWriter
	writer.close()
  1. 启动TB程序
    启动TB程序,并从命令行给出logdir路径。当同一个模型训练多次之后,TB可以将该目录下的所有event file的数据进行fusion。在TB web界面上呈现的便是连续变化的数据。
    命令行指令如下:
    $: tensorboard --logdir='/tmp/log'
    
    TB程序启动后默认使用6006端口,在web browser中输入localhost:6006,即可看到程序可视化结果。

汇总数据和事件数据

汇总数据

汇总数据是tf.summary.Summary类或其内嵌类的实例。tf.summary.Summary包含3个内嵌类:

  • Image
    用于表示图像数据

    message Image {
    	int32 height = 1;
    	int32 width = 2;
    	// colorspace value:
    	// 1 - grayscale 灰度图
    	// 2 - grascale + alpha 带透明度的灰度图
    	// 3 - RGB 彩色图
    	// 4 - RGBA 带透明度的彩色图
    	// 5 - DIGITAL_YUV 彩色图
    	// 6 - BGRA 32bit位图
    	int 32 colorspace = 3;
    	// image data after encoded
    	bytes encoded_image_string = 4;
    }
    
  • Audio
    用于表示音频数据

    message Audio{
    	// sample rate(unit: Hz)
    	float sample_rate = 1;
    	// channels of audio
    	int64 num_channels = 2;
    	// audio frame num
    	int64 length_frames = 3;
    	// audio data after encode
    	bytes encoded_audio_string = 4;
    	// data_type description with RF 2045 format
    	string content_type = 5;
    }
    
  • Value
    用于表示具名数值

    message Value {
    	// 输出该汇总数据的node name,如“some_op”
    	string node_name = 7
    	// data label, such as 'op_name:value_name'
    	// 其中,'op_name'通过层结构能够设置操作所属的集合
    	string tag = 1;
    
    	// the value of data label
    	oneof value{
    		float simple_value = 2;
    		bytes = obsolete_old_style_histogram = 3;
    		Image image = 4;
    		HistogramProto histo = 5;
    		Audio audio = 6;
    		TensorProto tensor = 8;
    	}
    }
    
    

事件数据

事件数据是tf.summary.Event()类的实例。事件数据表示在session中执行操作是产生的event info,包括时间戳、全局步数、以及oneof(多选一)方式定义的具体event info。对于一个特定的事件实例,event info只能从以下字段中选择一种:文件版本号、编码后的graph,summary data、TB log、Session status、metadata、以及编码后的meta-graph。它们分别代表相应类型对象的创建event。

部分原型定义如下:

message Event {
	double wall_time = 1;
	int64 step = 2;
	oneof what {
		// file version
		string file_version = 3;
		// graph after encoded
		bytes graph_def = 4;
		// summary data
		Summary summary = 5;
		// 由tensorboard_logging 模块生成的log
		LogMessage log_message = 6;
		// session log, to restart session after breakdown
		SessionLog session_log = 7;
		// metadata returned by sess.run()
		TaggedRunMetadata tagged_run_metadata = 8;
		// meta-graph after encoded
		bytes meta_graph_def = 9;		
	}
}

tf.summary.FileWriter工作原理

FileWriter向事件文件中写入的是event data,那么summary data 和其他序列化数据就需要转化为event data。此外,因为训练过程会产生大量数据,所以FileWriter还得支持并行地更新event file。

FileWriter的构造方法如下:

class FileWriter(SummartyToEventTransformer):
	def __init__(self, logdir, graph=None, max_queue=10, flush_secs=120, graph_def=None,filename_suffix=None):
		event_writer = EventFileWriter(logdir, max_queue, flush_secs)
		super(FileWriter, self).__init__(event_writer, graph, graph_def)

FileWriter类继承自SummaryToEvntTrasnforer类。FileWriter实例包含event_writer成员对象,后者是EventFileWriter的实例,提供向事件文件中写入event data的能力。因此,FileWriter内部实际调用的是event_write的成员方法来完成事件文件的创建和更新。

主要参数介绍:

  • logdir:存储event file的目录
  • graph:session中加载的graph
  • max_queue:缓存event data的队列大小
  • flush_secs:定期刷新event data缓存队列的时间
  • graph_def:被遗弃,为了兼容低版本TF,所以保留了参数
  • filename_suffix:设置事件文件的名称后缀

对于可视化数据的写入,一般使用基类SummaryToEventTransforer的成员方法:

  • SummaryToEventTransforer.add_event(),添加事件数据到事件文件
  • SummaryToEventTransforer.add_graph(),添加数据流图到事件文件
  • SummaryToEventTransforer.add_meta_graph(),添加元数据流图到事件文件
  • SummaryToEventTransforer.add_run_metadata(),添加元数据信息到事件文件
  • SummaryToEventTransforer.add_session_log(),添加会话日志到事件文件
  • SummaryToEventTransforer.add_summary(),添加summary data to event file。

上述方法并不会立即将数据写入事件文件,如果用户设置了flush_secs参数,FileWriter便会定期将event data缓存队列中的数据写入event file。用户也可以调用FileWriter.flush()手动刷新event data 缓存队列。

FileWriter类其他常用的成员方法:

  • FileWriter.get_logdir(),获取event file 的目录
  • FileWriter.flush(),将event data缓存队列中的所有数据添加到event file中
  • FileWriter.close(),先调用flush*(方法,然后关闭event filestream
  • FileWriter.reopen(),如果调用了close方法,则重新打开event filestream,并在logdir目录下新建一个event文件;否则不做任何操作。
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-04 19:55:33  更:2021-07-04 19:55:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/31 1:07:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码