本文记录使用tensorflow API过程中的遇到的一些坑
0、change log
API的改变还是要关注的,比如0.11版本增加了对hadoop的支持:
https://github.com/tensorflow/tensorflow/blob/master/RELEASE.md
1、调试
print大法好:
tf.Print 可以在计算一个变量的同时,指定打印一组变量,参见:
https://www.tensorflow.org/versions/master/api_docs/python/control_flow_ops.html#Print
tdb,tf的可视化工具https://github.com/ericjang/tdb
0.12版更改了summary的处理方式,示例参见:
http://stackoverflow.com/questions/41027247/tensorflow-0-12-0rc-tf-summary-scalar-error-using-placeholders
打开tensorboard:
sudo tensorboard --logdir=./tensorboard/ & # use & to non-block the shell
sleep 2
gnome-www-browser http://127.0.0.1:6006/
关闭tensorboard 服务
pgrep tensorboard |xargs sudo kill -9
2、内存泄露
每次采用tf.assign 甚至 tf.train.Saver(), 都会在当前graph中新增一个operator, 如果在循环中持续使用,不仅仅会造成内存泄露,更会拖慢速度!!!(我的某个训练从170ms逐渐变为1000ms+!!)
调试方法,增加完所有操作后采用
sess.graph.finalize()来使得整个graph变为只读的
具体参见:
注意:tf.train.Saver() 也算是往graph中添加node, 所以也必须放在finilize前
但是,,tf.train.Saver() 只会存储 在该Saver声明时已经存在的变量!!!
3、条件语句
由于dropout, batchnorm等函数在训练、预测时的依赖不同,需要使用
tf.case 选择不同的执行路径,
tf.cond 相当于if
tf.case 相当于switch
示例及存在的问题参见:
4、稀疏矩阵和tf.nn.embedding_lookup_sparse
这两个概念请单独理解,抛开tensorflow,如果你要表示一个稀疏矩阵要怎么表示?
是不是每个非零值有一个坐标和一个值,比如 (0,0):1.0
那么(0,0)就对应index中的一项, 1.0就对应value中的一项,
此外,这个矩阵还要有个大小,就对应shape项
再来说tf.nn.embedding_lookup_sparse,这个时候,矩阵的第一维已经是batch中样本的下标了,而第二维则是该特征对应的下标,,也就是(样本下标,特征下标)
需要注意的是,tensorflow中不允许样本没有也就是说batch_size为2的话,矩阵中至少要有两项:(0,x):1, (1,x):0 (实在没有就自己填个0吧)
注意:tf.nn.embedding_lookup_sparse的结果并不是某一项,而是需要通过combiner对每个样本的所有特征进行聚合,比如样本0有两个非零特征:
(0,0):1, (0,3):2, combiner='sum',则对应的结果为 1+2=3
但是,当前的combiner只支持"mean", "sqrtn" and "sum", 如果需要max,min,可以考虑通过tf.nn.embedding_lookup + tf.segment_max的方式实现(未验证)
tf.segment_max:
https://www.tensorflow.org/versions/master/api_docs/python/math_ops.html#segment_max
5、共享变量,多GPU
共享变量通过变量名实现,每个变量具有唯一的变量名,
变量名通过 tf.variable_scope控制,参见:
多GPU(数据并行):
tf将变量-模型分别存储,在每个GPU上生成一个模型, 模型对应的参数(变量)存储在内存上, 每个GPU分别对半个mini-batch数据计算梯度(假设有两个GPU),再在CPU上完成梯度的平均及更新。
写起来挺别扭的,操作需要自己指定设备。。。不能自动运用多GPU,具体的例子参见:
https://www.tensorflow.org/versions/master/tutorials/deep_cnn/index.html#training-a-model-using-multiple-gpu-cards
分享到:
相关推荐
oracle杂记.doc 这是我个人的总结。 主要是oracle的编程以及体系结构的理解。
第14章 Pythonic与Python杂记.mp4
李特伍德的《一个数学家的杂记》是一本收录了作者关于数学、教育以及个人观点文章的集合。这本杂记以数学为主题,涉及的内容包括几何、概率论、数论以及历史上的数学发现等。李特伍德在书中讨论了数学知识与日常生活...
杂记中所讲述的内容和描绘的场景,实际上蕴含了丰富的中国农村生活细节和风土人情,以及人性的细腻观察。以下是对这些内容的知识点解读: 首先,杂记中提到了家庭中烹饪的场景,特别强调了“蒸菜疙瘩”的制作过程。...
### 计算机基础知识知识点概览 ...它使用一系列的元素来构建页面结构和内容,如段落、链接、图片等。 - **特点**: - 结构清晰:通过标签来定义网页的不同组成部分。 - 跨平台性:可以在不同的操作系统和浏览器上...
14.6_None|Pythonic与Python杂记|Python3.8入门_&_进阶_&_原生爬虫实战完全解读
《Oracle 9i杂记——探索PLSQL的世界》 Oracle 9i,作为Oracle数据库的一个重要版本,引入了许多新特性和改进,其中PL/SQL(Procedural Language/Structured Query Language)是其核心组成部分,是一种结合了SQL和...
【数据库设计基础与PowerDesigner应用】 数据库设计是IT领域中至关重要的部分,它涉及概念设计、逻辑设计和物理设计等多个阶段。在概念设计阶段,我们主要关注实体、属性和联系集,这些都是构建数据库模型的基础...
installshield安装制作杂记 installshield x
反爬杂记日常记录十一字
爬虫杂记日常记录十一字
个人笔记美食杂记生活等
Hadoop大数据平台运维杂记 Hadoop大数据平台运维杂记是关于Hadoop大数据平台的运维经验总结,主要涵盖了Hadoop集群的使用情况、安装升级、Cloudera Manager、Hadoop的发展历程、常见事故处理等方面的内容。 一、...
《51单片机P89V51学习杂记》是针对电子工程初学者以及对51单片机有兴趣的开发者提供的一份宝贵资源。这份压缩包包含了关于51单片机及其应用的深入学习材料,特别是侧重于P89V51型号的单片机。下面将对其中的主要知识...
狱中杂记教学设计.pdf
《山中杂记》是高雪梅老师2013年教授的一篇语文课,属于义务教育课程标准实验教科书北师大版六年级下册第一单元的第一课。这篇文章是冰心在1923年留美期间因病在青山沙穰疗养院所作,原本是一组共十篇的散文,我们...
本资料“51单片机C语言学习杂记”旨在帮助读者掌握51单片机的基础知识,并通过C语言进行编程实践。 51单片机的核心部件包括CPU、存储器(包括ROM、RAM)、定时器/计数器、串行通信接口、并行I/O端口等。其中,CPU...
互联网杂记(六).docx
工作杂记-YUV的dump和read