最近看到一份不错的深度学习资源——Stanford中的CS20SI:《TensorFlow for Deep Learning Research》,正好跟着学习一下TensorFlow的基础,仍是收获颇丰,随手整理成博客随时翻阅。java
自从12年AlexNet得到ImageNet大赛的冠军后,深度学习开始流行起来,也由于硬件的快速发展GPU并行计算配合易用的API,让深度学习以及神经网络大放光彩。node
深度学习的框架其实有不少,目前来讲最火的还要数Pytorch、TensorFlow以及Keras。其中Pytorch比较适合学术研究,本身搞着玩,若是工业实践就不太适合了。TensorFlow因为时间比较久,学起来比较困难,不过有完整的开发、部署方案,还有大量的github项目可供参考。Keras则是TensorFlow的一个高级API,同类的还有TensorFlow的TFLearn等等。linux
总结来讲,若是你是学生,只是为了论文或者学习,那么推荐Pytorch;若是你是公司的开发者,想要在业务中使用深度学习,推荐直接使用TensorFlow,若是使用最新的1.12,那么官方的示例里面就已是Keras了;若是你是从github上面下载了源码想要学习,那就得去学习对应版本的TensorFlow API了。ios
在总结一下Tensoflow的优势:git
使用TensorFlow的公司包括:Google,OpenAI,DeepMind,SnapChat,Airbus,eBay等github
基于TensorFlow能够作不少事情,好比图像CV、天然语言处理NLP、语音识别等等。web
下面就来学习下TensorFlow的基础知识,TensorFlow不只提供了基础的语法,还提供了一些简化的API:json
若是作过大数据或者接触过java8的流计算,对这种数据流图应该比较了解。就是咱们在程序执行前,先构建好计算的流程框架,而后执行的时候现去读取数据分配资源执行计算。这样一方面把构建与计算分离,另外一方面也能够代码本身作更深的优化。windows
好比上面的数据流图中,事先定义好整个网络的结构,而后计算的时候直接传入5和3,就能获得结果23了。api
张量,不是张亮,更不是麻辣烫,它是一种高维数据的统称。好比:
所以TensorFlow,能够理解为Tensor+Flow,即张量的数据流。
import tensorflow as tf # 第一个例子,计算两个数的加法 a = tf.constant(2) b = tf.constant(3) x = tf.add(a, b) with tf.Session() as sess: print(sess.run(x))
在上面的代码中,就构建了一个最基本的数据流图的计算例子。
其中
a = tf.constant(2) b = tf.constant(3) x = tf.add(a, b)
就是在构建图。而想要拿到x的值,就必须新建一个session(这个时候才会分配资源),执行run方法(这个时候才会执行)。
为了方便查看构建图,须要学会怎么使用TensorBoard。在上面的代码中,只须要增长Tensorboard的声明便可:
import tensorflow as tf # 第一个例子,计算两个数的加法 a = tf.constant(2) b = tf.constant(3) x = tf.add(a, b) with tf.Session() as sess: writer = tf.summary.FileWriter('./graphs', sess.graph) print(sess.run(x)) writer.close()
而后在命令行中输入
tensorboard --logdir=/Users/xingoo/PycharmProjects/xxx/graphs
登陆localhost:6006
就能够看到下面的内容。
能够看到左边有描述每一个节点的意思,点击add后,能够到关于add节点的描述。因为构建的图很简单,就是两个数相加,所以整个图只有三个圈圈。而且按照默认的操做进行了命名。
增长如下图的复杂度,而且同时对两个结果计算:
import tensorflow as tf # tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False) a = tf.constant([1, 3], name="a") b = tf.constant([[0, 1], [2, 3]], name="b") x = tf.add(a, b, name="add") y = tf.multiply(a, b, name="mul") with tf.Session() as sess: writer = tf.summary.FileWriter('./graphs', sess.graph) x, y = sess.run([x, y]) print(x) print(y) writer.close()
因为x、y是独立运算没有什么交集,所以在图中,他们是独立的两个操做。
回头再来看看tensorFlow中的图究竟是什么呢?当使用第5部分中的代码构建graph时,能够直接输出graph的定义:
import tensorflow as tf a = tf.constant(2) b = tf.constant(3) x = tf.add(a, b) with tf.Session() as sess: print(sess.graph.as_graph_def())
获得以下的内容:
node { name: "Const" op: "Const" attr { key: "dtype" value { type: DT_INT32 } } attr { key: "value" value { tensor { dtype: DT_INT32 tensor_shape { } int_val: 2 } } } } node { name: "Const_1" op: "Const" attr { key: "dtype" value { type: DT_INT32 } } attr { key: "value" value { tensor { dtype: DT_INT32 tensor_shape { } int_val: 3 } } } } node { name: "Add" op: "Add" input: "Const" input: "Const_1" attr { key: "T" value { type: DT_INT32 } } } versions { producer: 26 }
每一个node基本都包含下面你的内容:
{ name:咱们本身起的名字,若是没有则是op+自增的数, op:操做 attr: 类型 attr:值 { 形状、初始值 } }
经过上面的json,就能完美的组合出web中看到的图了。
至于graph到底怎么用,就看后面一节课的内容吧。