Python 关于张量流中的反向传播深层神经网络

Python 关于张量流中的反向传播深层神经网络,python,tensorflow,deep-learning,Python,Tensorflow,Deep Learning,我正在阅读反向传播深度神经网络,据我所知,我可以将该类型神经网络的算法总结如下: 1-输入x:为输入层设置相应的激活 2-前馈:计算前向传播的误差 3-输出误差:计算输出误差 4-反向传播错误:计算反向传播的错误 5-产出:使用成本函数的梯度 没关系,然后我检查了许多这种深度网络类型的代码,下面是一个示例代码和解释: ### imports import tensorflow as tf ### constant data x = [[0.,0.],[1.,1.],[1.,0.],[0.,1

我正在阅读反向传播深度神经网络,据我所知,我可以将该类型神经网络的算法总结如下:

1-输入x:为输入层设置相应的激活

2-前馈:计算前向传播的误差

3-输出误差:计算输出误差

4-反向传播错误:计算反向传播的错误

5-产出:使用成本函数的梯度

没关系,然后我检查了许多这种深度网络类型的代码,下面是一个示例代码和解释:

### imports
import tensorflow as tf

### constant data
x  = [[0.,0.],[1.,1.],[1.,0.],[0.,1.]]
y_ = [[0.],[0.],[1.],[1.]]

### induction
# 1x2 input -> 2x3 hidden sigmoid -> 3x1 sigmoid output

# Layer 0 = the x2 inputs
x0 = tf.constant( x  , dtype=tf.float32 )
y0 = tf.constant( y_ , dtype=tf.float32 )

# Layer 1 = the 2x3 hidden sigmoid
m1 = tf.Variable( tf.random_uniform( [2,3] , minval=0.1 , maxval=0.9 , dtype=tf.float32  ))
b1 = tf.Variable( tf.random_uniform( [3]   , minval=0.1 , maxval=0.9 , dtype=tf.float32  ))
h1 = tf.sigmoid( tf.matmul( x0,m1 ) + b1 )

# Layer 2 = the 3x1 sigmoid output
m2 = tf.Variable( tf.random_uniform( [3,1] , minval=0.1 , maxval=0.9 , dtype=tf.float32  ))
b2 = tf.Variable( tf.random_uniform( [1]   , minval=0.1 , maxval=0.9 , dtype=tf.float32  ))
y_out = tf.sigmoid( tf.matmul( h1,m2 ) + b2 )


### loss
# loss : sum of the squares of y0 - y_out
loss = tf.reduce_sum( tf.square( y0 - y_out ) )

# training step : gradient decent (1.0) to minimize loss
train = tf.train.GradientDescentOptimizer(1.0).minimize(loss)


### training
# run 500 times using all the X and Y
# print out the loss and any other interesting info
with tf.Session() as sess:
  sess.run( tf.global_variables_initializer() )
  for step in range(500) :
    sess.run(train)

  results = sess.run([m1,b1,m2,b2,y_out,loss])
  labels  = "m1,b1,m2,b2,y_out,loss".split(",")
  for label,result in zip(*(labels,results)) :
    print ""
    print label
    print result

print ""
我的问题是,上面的代码正在计算前向传播的误差,但我没有看到计算后向传播误差的任何步骤。换句话说,按照上面的描述,我可以看到步骤1输入x、2前馈、3输出错误和5输出,但是代码中没有显示步骤4,即反向传播错误!!这是对的还是代码中缺少了什么?我在网上找到的所有代码都遵循反向传播深层神经网络中的相同步骤! 请您描述一下反向传播错误的步骤是如何在代码中发生的,或者我应该为执行该步骤添加什么


谢谢你

简单地说,当你在代码中计算损耗时,当你构建TF图时,TF将知道损耗取决于哪个TF。可变权重。然后,当您创建节点train=tf.train.GradientDescentOptimizer1.0.minimizeloss,然后在tf.Session中运行它时,将在后台为您完成反向传播。更具体地说,train=tf.train.GradientDescentOptimizer1.0.minimizeloss合并了以下步骤:

# 1. Create a GD optimizer with a learning rate of 1.0
optimizer = tf.train.GradientDescentOptimizer(1.0)
# 2. Compute the gradients for each of the variables (weights) with respect to the loss
gradients, variables = zip(*optimizer.compute_gradients(loss))
# 3. Update the variables (weights) based on the computed gradients
train = optimizer.apply_gradients(zip(gradients, variables))
具体而言,步骤1和2总结了反向传播步骤。希望这能让你更清楚

此外,我想重组你问题中的步骤:

输入X:神经网络的输入。 前向传递:通过神经网络传播输入,以获得输出。换句话说,将输入X与代码中的每个tf.变量相乘。 损失:步骤2中获得的输出与预期输出之间的不匹配。 计算梯度:计算每个tf的梯度。关于损失的可变权重。 更新权重:根据每个tf对应的梯度更新其可变权重。
请注意,步骤4和5封装了反向传播。

是的,谢谢。所以我现在理解的是反向传播不是一个独立的神经网络,我的意思是所有的神经网络都在训练阶段执行反向传播,对吗?基本上这就是训练阶段。计算权重相对于损失的梯度,并更新神经网络的权重。是的,我明白了。。你说了,并更新了神经网络的权重。。该更新将在正向传播和反向传播中进行?或者仅在正向传播中,但正向传播和反向传播仅适用于反向传播神经网络?正向传播只是将输入与所有矩阵相乘,以获得神经网络的输出。损失是预期输出和您得到的输出之间的不匹配。反向传播是权值相对于计算损失的更新。请不要误会,但我真的认为你应该在进入TF之前先学习这些概念。这样,你将更容易理解一切并付诸实践。我还根据你的误解更新了我的答案。请随意查看。