TensorFlow 里的一些概念并不straightforward。在这里我把自己经过这一段时间学习的一些理解写下来,希望能帮到其他人。
TensorFlow是一个机器学习框架,它的程序结构当然也都是为深度学习准备的。我们先来看一下一个机器学习的过程是怎样的:

问题

用户要解决一个多分类问题。以一个普通神经网络为例,用户有100条样本记录,每个记录里有8个feature,f1-f8。最终要把一个样本分为3个分类中的一个c1-c3。

网络设计

首先我们要做的就是设计这个网络,比如我们的输入层有8个神经元,一个隐藏层,有16个神经元,一个输出层有3个神经元。
输出层我们用给一个softmax来做分类。

定义loss函数

我们用交叉熵函数来定义loss

减少loss

我们通过loss值来计算梯度,并进行反向传播

多次迭代

正向传播->计算loss->减少loss(反向传播)->正向传播->计算loss->减少loss(反向传播)->…
这样经过多次迭代后loss越来越小。模型越来越精确。

下边我们来看TensorFlow是怎么帮助我们完成上边工作的。我们在进行正向传播是,计算的数字其实来自两个部分, 1. 输入的数据,以及每层的输出。他们每次迭代都是独立的。
2. 网络的参数,每次迭代他们都是在上次迭代的基础上根据梯度和学习率不断做修正的。

Variable

其中需要每次迭代更新的网络参数,在TensorFlow里就用Variable来定义。

Tensor

不需要在迭代间更新的,比如输入,每层的输出,都是用Tensor来定义。

PlaceHolder

因为机器学习可能用到很大的数据来进行训练,我们不能每次训练把所有样本数据加载到内存。所以我们每次迭代只取数据中的一部分,(batch)来进行网络的训练,如果我们每次迭代的数据都不一样,怎么定义网络呢?那就用PlaceHolder。它先占个位置,每次迭代的时候你传入一个Tensor就可以。

Optimizer

Optimizer最重要的方法就是minimize方法,我们用它来minimize我们的loss值,因为loss的计算依赖到了网络里的Variable和Tensor,一直到input。所以Optimizer可以根据依赖关系知道我们整个的计算流图,从而链式求导,反向传播,优化网络。

Graph

Graph就是我们定义的网络。并且它还包含了Variable的collection。

Session

Session里最重要的方法就是run,session的run方法就是执行一个Operation,最重要的是执行Optimizer的minimize方法。来更新网络参数。我们通过迭代多次调用run方法来达到训练网络的目的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: