Tensorflow:它如何训练模型?

时间:2016-10-03 07:33:12

标签: python tensorflow

使用Tensorflow,第一步是构建数据图并使用会话来运行它。而在我的练习中,如MNIST tutorial。它首先定义了 loss 函数和优化器,并使用以下代码(之前定义了MLP模型):

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) #define cross entropy error function

loss = tf.reduce_mean(cross_entropy, name='xentropy_mean') #define loss

optimizer = tf.train.GradientDescentOptimizer(learning_rate) #define optimizer

global_step = tf.Variable(0, name='global_step', trainable=False) #learning rate

train_op = optimizer.minimize(loss, global_step=global_step) #train operation in the graph

培训流程:

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


for i in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

这就是Tensorflow在这种情况下进行培训的方式。但我的问题是,Tensorflow是如何知道需要培训和更新的重量的?我的意思是,在训练代码中,我们只将输出y传递给cross_entropy,但对于optimizerloss,我们没有传递任何有关结构的信息直接即可。此外,我们使用词典将批量数据提供给train_step,但train_step没有直接使用数据。 Tensorflow如何知道将这些数据用作输入?

对于我的问题,我认为可能所有这些变量或常量都存储在 Tensor 中。诸如tf.matmul()之类的操作应该是Tensorflow操作类的“子类”(我还没有检查代码)。 Tensorflow可能有一些机制来识别张量(tf.Variable()tf.constant())和操作(tf.mul()tf.div() ...)之间的关系。我猜,它可以检查tf.xxxx()的超级类,以确定它是张量还是操作。这个假设提出了我的第二个问题:我应该尽可能使用Tensorflow的'tf.xxx'函数来确保张量流可以构建正确的数据流图,即使有时它比普通的Python方法或某些函数更复杂在Numpy比Tensorflow更好地支持?

我的上一个问题是:Tensorflow和C ++之间是否有任何关联?我听说有人说Tensorflow比普通的Python更快,因为它使用C或C ++作为后端。是否有任何转换机制将Tensorflow Python代码传输到C / C ++?

如果有人可以在Tensorflow的编码中分享一些调试习惯,我也会很优雅,因为目前我只是设置一些终端(Ubuntu)来测试我的代码的每个部分/功能。

2 个答案:

答案 0 :(得分:1)

当您使用以下命令定义损失时,确实会将有关结构的信息传递给Tensorflow:

loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')

请注意,使用Tensorflow可以构建操作图,您在代码中使用的每个操作都是图中的一个节点。

当您定义loss时,您正在传递cross_entropy中存储的操作,该操作取决于y_yy_是您输入的占位符,而yy = tf.nn.softmax(tf.matmul(x, W) + b)的结果。看看我要去哪里?操作loss包含构建模型和输入过程所需的所有信息,因为它取决于操作cross_entropy,这取决于y_y,取决于输入x和模型权重W

所以当你打电话

sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

Tensorflow完全知道在运行train_step时应该计算哪些操作,并且它确切知道在操作图中将您传递的数据feed_dict放在哪里。

至于Tensorflow如何知道应该训练哪些变量,答案很简单。它训练可训练的操作图中的任何tf.Variable()。请注意在定义global_step时设置trainable=False的方式,因为您不想计算该变量的渐变量。

答案 1 :(得分:0)

像其他任何机器学习神经网络一样,Tensorflow也使用反向传播。只要您知道非常基本的演算,就很容易知道这是如何工作的。

如果您知道神经网络的工作原理,请跳过这一部分:

神经网络通过使所有输入具有初始层来工作。我们通过简单的操作来计算下一层。对于第二层中的每个神经元,我们有一个偏差和权重的数量(该数量是上一层中神经元的数量,您将看到原因)。我们首先将每个权重乘以上一层中的相应神经元。然后,我们增加了神经元的偏见。(还有挤压功能,但您不必知道),这一过程在每一层和每层都继续。

机器学习部分:

我们唯一需要改变的就是权重和偏见。这就是微积分的来源。损失函数或损失函数是告诉我们输出与期望输出的差距的函数。我们希望它尽可能低,换句话说,就是最小值(在这种情况下,它是局部的,而不是全局的,但是所有局部的最小值都非常相似)。要求出最小值,我们需要计算特定偏差或重量会增加或减少成本(衍生产品)。我们改变了权重或偏见,以减少损失。我们对每个权重和偏差进行数百次操作,直到损失接近于0,这意味着输出是期望的输出。