使用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
,但对于optimizer
或loss
,我们没有传递任何有关结构的信息直接即可。此外,我们使用词典将批量数据提供给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)来测试我的代码的每个部分/功能。
答案 0 :(得分:1)
当您使用以下命令定义损失时,确实会将有关结构的信息传递给Tensorflow:
loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')
请注意,使用Tensorflow可以构建操作图,您在代码中使用的每个操作都是图中的一个节点。
当您定义loss
时,您正在传递cross_entropy
中存储的操作,该操作取决于y_
和y
。 y_
是您输入的占位符,而y
是y = 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,这意味着输出是期望的输出。