首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在本例中执行反向传播的位置

在本例中执行反向传播的位置
EN

Stack Overflow用户
提问于 2019-09-28 02:55:31
回答 2查看 788关注 0票数 0

我有一个学习XOR的DNN示例(右击在新选项卡中打开):https://colab.research.google.com/drive/1M5xFp4gaXPCbnejM8-5_yLp1B6UvwdL8

我对这两行(与反向传播有关)感到困惑:

代码语言:javascript
复制
Grads = T.gradient(Loss,[W1,B1,W2,B2]);
Optim.apply_gradients(zip(Grads,[W1,B1,W2,B2]));

我猜想反向循环是在T.gradient,因为这些是与损失相关的梯度值,但我仍然不清楚。问题如下:

  • Question1.在这2 lines?
  • Question2.中是否存在反向传播(反向循环)?如果有反向传播,它在T.gradientT.gradient因为反向传播是向后进行的,所以[W1,B1,W2,B2]的顺序重要吗?我相信,如。这种洗牌的[B1,W2,B2,W1]不可能是相同的,因为反向传播需要从输出到输入的层顺序。

根据我的尝试,当调整变量数组中权重和偏差的顺序时,优化过程仍然有效。但是反向传播需要从输出到输入的层顺序,我没有得到这个

源代码:

代码语言:javascript
复制
#!pip install tensorflow==2.0.0rc2
%tensorflow_version 2.x
%reset -f

#libs
import tensorflow as tf;

#data
X = [[0,0],[0,1],[1,0],[1,1]];
Y = [[0],  [1],  [1],  [0]  ];
X = tf.convert_to_tensor(X,tf.float32);
Y = tf.convert_to_tensor(Y,tf.float32);

#model
W1 = tf.Variable(tf.random.uniform([2,20],-1,1));
B1 = tf.Variable(tf.random.uniform([  20],-1,1));

W2 = tf.Variable(tf.random.uniform([20,1],-1,1));
B2 = tf.Variable(tf.random.uniform([   1],-1,1));

@tf.function
def feedforward(X):
  H1  = tf.nn.leaky_relu(tf.matmul(X,W1) + B1);
  Out = tf.sigmoid(tf.matmul(H1,W2) + B2);
  return Out;
#end def

#train
Optim = tf.keras.optimizers.SGD(1e-1);
Steps = 1000;

for I in range(Steps):
  if I%(Steps/10)==0:
    Out  = feedforward(X);
    Loss = tf.reduce_sum(tf.square(Y-Out));
    print("Loss:",Loss.numpy());
  #end if

  with tf.GradientTape() as T:
    Out  = feedforward(X);
    Loss = tf.reduce_sum(tf.square(Y-Out));
  #end with

  #BACKPROPAGATION HERE?
  Grads = T.gradient(Loss,[W1,B1,W2,B2]);
  Optim.apply_gradients(zip(Grads,[W1,B1,W2,B2]));
#end for

Out  = feedforward(X);
Loss = tf.reduce_sum(tf.square(Y-Out));
print("Loss:",Loss.numpy(),"(Last)");

print("\nDone.");
#eof
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-01 10:25:23

使用TensorFlow 2在默认的急切模式下,即使没有@tf.function装饰器也能生成图形。TensorFlow在计算时仍在跟踪张量之间的关系:https://stats.stackexchange.com/a/272000/142160

TensorFlow在这里跟踪每个变量:

代码语言:javascript
复制
with tf.GradientTape() as T:
    Out  = feedforward(X);
    Loss = tf.reduce_sum(tf.square(Y-Out));

它是自动微分(有点蒙特卡罗方法),而不是数学微分,因此,下列函数得到的所有梯度在反向传播中已经处于适当的深度(就像在所有层上计算误差的后向循环一样):

代码语言:javascript
复制
Grads = T.gradient(Loss,[W1,B1,W2,B2]);

在此之后,优化器将应用梯度来改变权重和偏差:

代码语言:javascript
复制
Optim.apply_gradients(zip(Grads,[W1,B1,W2,B2]));
票数 1
EN

Stack Overflow用户

发布于 2019-09-28 03:15:35

让我们一步一步地走。

步骤1:梯度的计算:

代码语言:javascript
复制
Grads = T.gradient(Loss,[W1,B1,W2,B2])

在这里,我们计算损失的梯度相对于提供的列表中的变量。梯度列表是根据变量的索引进行索引的。这意味着Grads[0]将是相对于W1的梯度,依此类推。

第2步:下一步,我们执行更新。这是在以下方面进行的:

代码语言:javascript
复制
Optim.apply_gradients(zip(Grads,[W1,B1,W2,B2]))

在这里,Grads[0]用于更新W1Grads[1]用于更新B1等等。

注意,梯度计算和更新步骤分别执行。因此,只要变量在两个列表中以相同的顺序出现,就不会有任何问题。

此外,GradientTape还必须与急切的执行一起使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58143008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档