CS224N笔记——TensorFlow入门

目录

深度学习框架简介

TensorFlow是什么

图计算编程模型

图在哪里

如何运行

如何定义损失

如何计算梯度

变量共享

总结


深度学习框架简介

为什么要用成熟的框架,而不是从头写一个:

  • 这些框架提供了大规模机器学习算法的成熟实现

  • 方便地计算梯度

  • 标准化机器学习应用,方便共享交流

  • 多种算法、理念、抽象、编程语言等的融合

  • 提供GPU并行运算的接口

 

TensorFlow是什么

  • TensorFlow是一个图计算的开源类库

  • 最初由Google Brain团队开发,用来进行机器学习研究

  • “TensorFlow是一个描述机器学习算法和实现机器学习算法的接口”

 

图计算编程模型

中心思想是将数值运算以图的形式描述。

  • 图的节点是某种运算,支持任意数量的输入和输出

  • 图的边是tensor(张量,n维数组),在节点之间流动

比如ReLU激活函数:h=ReLU(Wx+b)

计算图如下:

其中W和b是变量,变量通常是模型的参数。这些数据也可看做运算节点,只不过是无输出产生输出的节点。变量可以储存下来,作为模型的一部分发布。而x只是一个placeholder(占位符),只在执行的时候填充输入,编程的时候指定大小即可。剩下的3个节点MatMul,Add,ReLU是运算单元。

要描述这样的图运算,只需编写代码:

这段代码只是构建了运算图,连输入都没有,自然无法马上获取h的值。

 

图在哪里

上述代码并没有显式地声明节点和边,TensorFlow根据数学表达式自动构造了运算图。

 

如何运行

到目前为止,我们只定义了一张图,如何执行它呢?我们可以通过session将这张图部署到某个执行环境(CPU、GPU、Google的TensorProcessingUnit……)上去。session就是到某个软硬件执行环境的绑定。

在代码中只需新增三行:

其中第一个run初始化了所有变量。第二个run中有两个概念:

sess.run(fetches, feeds)

fetches是一系列图节点(其实就是某个节点,因为图是连通的,给我一个节点总可以找到所有节点)或说变量。feeds是一个从placeholder到其输入值的映射。

 

如何定义损失

用变量定义损失,用placeholder定义label:

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)

 

如何计算梯度

先初始化一个optimizer,然后在图中损失函数节点后面添加一个优化操作(最小化,也是一种运算节点):

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

就像(大部分)函数都有自己的导数一样,TF中的运算节点都附带了梯度操作。在反向传播中,TF在计算图的逆向图上利用链式法则自动计算梯度。用户不需要编写梯度计算与参数更新的代码,而是交给optimizer自动完成。

在代码中是这样调用的:

 

变量共享

有时候我们想要生成一张图的多个实例,或者在多机多个GPU上训练同一个模型,就会带来同一个变量在不同位置出现。如何在不同位置共享同一个变量呢?

一种朴素的想法是弄个字典建立变量名到variable的映射:

variables_dict = {
    "weights": tf.Variable(tf.random_normal([782, 100]),name="weights")
    "biases": tf.Variable(tf.zeros([100]), name="biases")
    }

但这样容易导致变量名冲突,TF支持命名空间:

with tf.variable_scope("foo"):
    v = tf.get_variable("v", shape=[1])  # v.name == "foo/v:0"

with tf.variable_scope("foo", reuse=True):
    v1 = tf.get_variable("v")  # Shared variable found!

with tf.variable_scope("foo", reuse=False):
    v1 = tf.get_variable("v")  # CRASH foo/v:0 already exists!

 

总结

  1. 创建图
    a 前向传播/预测
    b 优化操作

  2. 初始化session

  3. 在session中执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值