1 TF是什么?
2. 主要过程
2.1 参数variables和占位符placeholder的区别
3 训练
3.1 我们如何定义一个loss?
3.2 loss定义完后,我们就要开始计算梯度(gradients)
3.3 最后一步,我们需要创建一个迭代的学习模型
4 总结
5 用TensorFlow实现线性模型
6 用TensorFlow实现word2vec的skipgram
1 TF是什么?
不是TF口红,也不是TF boys,hhh 感觉这个好好玩。
- TensorFlow是一个图计算的开源类库
- 最初由Google Brain团队开发,用来进行机器学习研究
- “TensorFlow是一个描述机器学习算法和实现机器学习算法的接口”
图计算编程模型
- 中心思想是将数值运算以图的形式描述。
- 图的节点是某种运算,支持任意数量的输入和输出
- 图的边是tensor(张量,n维数组),在节点之间流动。
- 代码并没有显式地声明节点和边,TensorFlow根据数学表达式自动构造了运算图。
2. 主要过程
我们首先用参数和placeholder得到一个流图,然后将我们的图部署到会话(session)上。
可以通过session将这张图部署到某个执行环境(CPU、GPU、Google的TensorProcessingUnit……)上去。session就是到某个软硬件执行环境的绑定。
要描述这样的图运算,只需编写代码:
2.1 参数variables和占位符placeholder的区别
参数例如w和b,是我们要求的结果,它们也是需要初始化的。
而placeholder就是x,但是输入x是些什么,我们并不在意,不同的问题x是不同的,因此它只是一个占位符(placeholder),我们最重要的是得到参数w和b。
并且placeholder是不需要被更新的,如果定义为variables,则在后面进行梯度更新时,会默认更新所有的variables,而placeholder x是不需要被更新的。
定义好图后,在代码中只需新增三行进行计算:
其中第一个run初始化了所有变量。第二个run中有两个概念:
sess.run(fetches, feeds)
fetches是一系列图节点(其实就是某个节点,因为图是连通的,给我一个节点总可以找到所有节点)或说变量。feeds是一个从placeholder到其输入值的映射【什么意思?】。
3 训练
3.1 我们如何定义一个loss?
预测值和真实值之间的交叉熵。
prediction = tf.nn.softmax(...) #Output of neural network
label = tf.placeholder(tf.float32, [100, 10])
cross_entropy = -tf.reduce_sum(label * tf.log(prediction), axis=1)
3.2 loss定义完后,我们就要开始计算梯度(gradients):
先初始化一个optimizer,然后在图中损失函数节点后面添加一个优化操作(最小化,也是一种运算节点):
就像(大部分)函数都有自己的导数一样,TF中的运算节点都附带了梯度操作。在反向传播中,TF在计算图的逆向图上利用链式法则自动计算梯度。用户不需要编写梯度计算与参数更新的代码,而是交给optimizer自动完成。
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
通过图使用链式法则进行反向传播是十分容易的,这也是使用图计算的最大好处。
train_step这一行包含了很多信息,使用(1)使用梯度下降法更新参数;(2)知道更新的参数有哪些;(3)学习率为0.5;(4)目标函数是最小化loss function交叉熵。
3.3 最后一步,我们需要创建一个迭代的学习模型
比如迭代1000次
接下来,助教介绍了一篇论文,visual dialog,给出一个图片,对图片进行提问,得到自动回复的答案。
4 总结
TF的用法总结如下:
- 创建图
a 前向传播/预测
b 优化操作 - 初始化session
- 在session中执行
5 用TensorFlow实现线性模型
x,y的shape都设置为None是为了方便变动
loss_val.mean()是取平均值,因为每个样本数据都有一个loss
6 用TensorFlow实现word2vec的skipgram
以上只是在训练集上,因此增加了73、74行:
以上都是印度小哥拿着MBP开始现场敲代码了,用的是Vim,经常少敲了括号,最后跑word2vec死活不知道哪里敲错了,干脆把写好的word2vec_complete.py调出来了事。这说明:
- 至少在学习TF上,MBP还是有很多人在用的
- 现场敲代码压力还是很大的
- 一个有纠错提示的IDE还是很重要的
emmmm… MBP好贵><