TensorFlow实战--阅读笔记part1

这本书适合看过官方文档或其他基础教程的人,讲的多是些具体网络的实现

一、tensorflow基础

tensorflow的操作流程

1. 自定义节点,自定义有向图,一般是把整个流程图都定义完整

每个需要看输出结果的节点都必须有显式地进行定义,形式如 node=......  比如2,3,4,5,6行等

对于不需要进行输出的节点可以不进行显示定义,比如Add

2. 通过Session的run方法进行执行计算图

每次run都是指定一个节点计算,比如说: tf.Session.run(ReLU)

我们要计算ReLU的话,同时它依赖的一些节点都会按顺序进行计算,比如说Add,MatMul,

同时我们看到还需要有输入x, 那么我们需要把x作为参数输入到run函数:

tf.Session.run(ReLU,feed_dict={x:input})

其中x是定义的placeholder节点,作为外部输入的节点类型都为tf.placeholder

input是实际的数据(矩阵或者列表)

W,b是定义的变量节点 tf.Variable, 注意V是大写

3. 总结

  • 如果创建图之后发现图不够完整还需要添加边或者节点,可以通过Session的Extend方法添加新的节点或者边
  • Session的run方法执行计算图时,用户需要给出需要计算的结点,也就是你所想要看到的结果,同时还要提供输入数据,Tensorflow就会自动寻找所有需要计算的节点并按依赖顺序执行它们。通常来说,都是创建一次计算图,然后反复地执行整个计算图或是其中的一部分子图
  • 计算图会被执行多次,但是数据(tensor)不会被持续保留,只是在计算图中过一遍,也就是为什么取名叫tensorflow了,数据流过无痕
  • 比如说你计算ReLU节点的时候会计算Matmul结点,但是数据不会保留,则是只会输入ReLU结果,所以当你还要看Matmul结果时,你需要重新计算Matmul节点
  • 上面所说的是计算的中间结果不会保存,但是Variable作为一种特殊的运算操作,它可以将一些需要保留的tensor存储在内存或显存中,比如神经网络模型中的系数。每一次执行计算图后,Variable中的数据tensor会被保存,同时在计算过程中这些tensor也可以被更新,比如神经网络的每一次mini-batch训练时,神经网络的系数将会被更新并保存

Tensorflow的实现原理(设备管理)

client客户端, 通过Session的接口与master及多个worker相连。其中每一个worker与多个硬件设备相连(CPU/GPU),并负责管理这些硬件

master则负责指导所有worker按流程执行计算图

Tensorflow有单机模式和分布式模式两种实现:

  • 单机模式:client,master,worker全部在一台机器上的同一个进程中
  • 分布式模式:允许client,master,worker在不同机器的不同进程中,同时由集群调度系统统一管理各项任务

      

Tensorflow中每一个worker可以管理多个设备,每一个设备的name包含硬件类别、编号、任务号(单机版本中没有),示例如下:

单机模式:/job:localhost/device:cpu:0
分布式模式:/job:worker/task:17/device:gpu:3

在只有一个硬件设备的情况下,计算图会按依赖关系被顺序执行。当一个节点的所有上游依赖都被执行完时(依赖数为0),这个节点就会被加入ready queue以等待执行。同时,它下游所有节点的依赖数减1,实际上这就是标准的计算拓扑序的方式。当有多个设备时,情况就比较复杂了,难点有二:

  1. 每一个节点该让什么硬件设备执行:  tensorflow设计了一套为节点分配设备的策略,有相应的代价模型,会选择一个综合实践最短的设备作为节点的运算设备。以后还会改进
  2. 如何管理节点间的数据通信:把数据通信的问题转变为发送节点和接收节点的实现问题,用户不需要为不同的硬件环境实现通信方法

    

Tensorflow分布式执行时的通信和单机设备间的通信很像,只不过是对发送节点和接收节点的实现不同:比如从单机的CPU到GPU的通信,变为不同机器之间使用TCP或者RDMA传输数据。

Tensorflow扩展功能

tensorflow自动求导

如下图,当tensorflow计算一个tensor C关于tensor I的梯度时,会先寻找从I到C的正向路径,然后从C回溯到I,对这条回溯路径上的每一个节点增加一个对应求解梯度的节点,并根据链式法则计算总的梯度,这就是反向传播算法。这些新增的节点会计算梯度函数比如[db,dW,dx] = tf.gradients(C,[b,W,x])

      

问题:当计算反向传播时,可能需要用到前面图开头的一些tensor,然而这些中间结果tensorflow不会保存,保存tensor会占用太多内存或显存,所以一般不进行保存而选择重新计算,tensorflow仍在持续改进这些问题

二、Tensorflow和其他深度学习框架的对比

tensorflow优点

设计神经网络结构的代码的简洁度

分布式深度学习算法的执行效率

部署的便利性

Caffe

caffe优点:

  • 容易上手,网络结构都是以配置文件形式定义,不需要用代码设计网络
  • 训练速度快,能够训练state-of-the-art 的模型和大规模的数据
  • 组件模块化,可以方便地拓展到新的模型和学习任务上
  • 拥有大量的训练好的经典模型,收藏在  Model Zoo

caffe缺点:

  • 实现新layer时,需要将正向和反向两种计算过程的函数都实现,这部分计算需要用户自己写C++或CUDA(当需要运行在GPU上)代码,对普通用户来说非常难上手
  • Caffe最初设计时的目标只针对图像,没有考虑文本语音等时间序列数据,所以caffe对CNN支持非常好, 但是对RNN支持不充分
  • caffe的配置文件不能用编程的方式调整超参,不方便进行交叉验证,超参数的Grid Search等

Theano

theano优点:

  • 集成Numpy,可以直接使用Numpy的ndarray,API接口学习成本低
  • 计算稳定性好,比如可以精准地计算输出值很小的函数(像log(1+x))
  • 动态地生成C或者CUDA代码,用以编译成高效的机器代码
  • theano自动求导
  • theano派生出了大量基于它的深度学习库,比如Keras,Lasagne
  • Keras比较适合在探索阶段快速地尝试各种网络结构,组件都是可插拔的模块,只需要将一个个组件(比如卷积层、激活函数等)连接起来,但是设计新模块或者新的Layer就不太方便
  • 学术界喜爱的Lasagne,对神经网络内的每一层的定义都非常严谨

theano缺点:

  • 更多作为一个研究工具而不是产品
  • 没有底层C++接口,所以模型部署非常不方便,依赖于各种python库,不支持各种移动设备,所以几乎没有在工业生产环境的应用
  • Theano在调试时输出的错误信息非常难看懂,debug很痛苦

Torch

用lua语言编程

MXNet

  • 各个框架中率先支持多GPU和分布式的
  • MXNet的核心是一个动态的依赖调度器,支持自动将计算任务并行化到多个GPU或分布式集群
  • 支持非常多的语言封装

CNTK

  • 在语音识别领域中使用广泛
  • 支持自动求解梯度
时间: 2024-08-08 00:14:44

TensorFlow实战--阅读笔记part1的相关文章

TensorFlow实战--阅读笔记part3

一.Tensorflow实现卷积神经网络 卷积神经网络的概念最早出自19世纪60年代科学技术提出的感受野.当时科学家通过对猫的视觉皮层细胞研究发现,每一个视觉神经元只会处理一小块区域的视觉图像,即感受野. 一个卷积层中可以有多个不同的卷积核,而每一个卷积核都对应一个滤波后映射出的新图像,同一个新图像中每一个像素都来自完全相同的卷积核,这就是卷积核的权值共享. 权值共享是为了降低模型复杂度,减轻过拟合并降低计算量. 一个隐含节点对应于新产生的图的一个像素点 1994年LeNet (Yann LeC

TensorFlow实战--阅读笔记part4

Tensorflow实现经典神经网络 一.Tensorflow实现AlexNet 2012年,Hinton的学生Alex Krizhevsky提出了深度卷积神经网络模型AlexNet,它算是LeNet的一种更深更宽的版本.它包含了几个比较新的技术点,也首次在CNN中成功应用了ReLU,Dropout和LRN等trick.同时AlexNet也使用了GPU进行运算加速,AlexNet包括了6亿3000万个连接,6000万个参数和65万个神经元,拥有5个卷积层. AlexNet主要使用到的新技术有如下

TensorFlow实战--阅读笔记part2

一.Tensorflow编译安装 推荐使用Anaconda作为python环境,可以避免大量的兼容性问题 tensorflow安装过程 以在服务器上安装为例(linux) 1.在anaconda官网上下载与自己机器对应的版本 下载.sh形式的文件 2.在anaconda下载目录中输入以下路径(下载的文件名可能不同) $ bash Anaconda-4.2.0-Linux-x86_64.sh 3. 安装tensorflow-cpu版本  如果要安装gpu,请跳到第4步 推荐安装编译好的releas

Redis实战阅读笔记——开始

Redis实战这本书,看完以后最大的不是redis本身的东西,而是作者面对实际问题的分析而给出的设计方案,可以看成NoSql设计的应用.个人从这方面收获很多,至于Redis本身的东西,这个就花一两个小时就可以知道大致是怎么一回事了.具体API就直接查查就OK.关键是怎么用,这才是灵感创造所在,看看别人解决问题的思路,学习学习哈.

Redis实战阅读笔记——第一章

Redis 实战 中文版 的20-21页看的人郁闷死了,最后看英文版才明白意思,哎,我理解能力差成这样了 其中,图 1-12 有错误,草,这个是英文版的错--应该是group:programming

Hadoop阅读笔记(四)——一幅图看透MapReduce机制

时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过,请指教如何能以效率较高的方式学习Hadoop. 我已经记不清圣经<hadoop 实战2>在我手中停留了多久,但是每一页每一章的翻过去,还是在脑壳里留下了点什么. 一段时间以来,我还是通过这本书加深以及纠正了我对于MapReduce.HDFS乃至Hadoop的新的认识.本篇主要介绍MapReduce

Hadoop阅读笔记(三)——深入MapReduce排序和单表连接

继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算方法,更是一种解决问题的新思维.新思路.将原先看似可以一条龙似的处理一刀切成两端,一端是Map.一端是Reduce,Map负责分,Reduce负责合. 1.MapReduce排序 问题模型: 给出多个数据文件输入如: sortfile1.txt 11 13 15 17 19 21 23 25 27

Hadoop阅读笔记(二)——利用MapReduce求平均数和去重

前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一年……我在博客园-_-#,希望用dt的代码燃烧脑细胞,温暖小心窝. 上篇<Hadoop阅读笔记(一)——强大的MapReduce>主要介绍了MapReduce的在大数据集上处理的优势以及运行机制,通过专利数据编写Demo加深了对于MapReduce中输入输出数据结构的细节理解.有了理论上的指导,仍

QCon 2015 阅读笔记 - 团队建设

QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 中西对话:团队管理的五项理论和实战 - 谢欣.董飞(今日头条,LinkedIn) 两位讲解人其实都是比较有经验的,来自国内外一线互联网企业. 谢欣:微软->百度->酷讯(创业)->今日头条 董飞:酷讯->百度->亚马逊->LinkedIn 实战一:人才招聘面试 来源:内推,linkedIn 喜欢:聪明,好奇,热情,交流 不喜欢:不愿学习,不符合企业