繁体   English   中英

张量流中的反向传播深度神经网络

[英]about backpropagation deep neural network in tensorflow

我正在阅读有关反向传播深度神经网络的信息,据我了解,我可以将这种神经网络的算法总结如下:

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.Variable (权重)。 然后,当您创建节点train = tf.train.GradientDescentOptimizer(1.0).minimize(loss) ,然后在tf.Session运行它时,将在后台为您进行反向传播。 更具体地说, train = tf.train.GradientDescentOptimizer(1.0).minimize(loss)合并了以下步骤:

# 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))

特别地,步骤12总结了反向传播步骤。 希望这会使您更清楚!


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

  1. 输入X:神经网络的输入。
  2. 正向传递:通过神经网络传播输入,以获取输出。 换句话说,将输入X与代码中的每个tf.Variable
  3. 损耗 :步骤2中获得的输出与预期输出之间的不匹配。
  4. 计算梯度:计算每个tf.Variable (权重)相对于损耗的梯度。
  5. 更新权重 :根据其相应的梯度更新每个tf.Variable (权重)。

请注意,步骤4和5封装了反向传播。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM