如何在TensorFlow中拦截自动微分的渐变?

时间:2016-08-28 21:20:31

标签: tensorflow

假设我有两个后续图层,其中包含激活a1a2。有没有办法拦截自动微分从第2层传播到第1层的梯度,即∂E/∂a2?我想更改此渐变,然后将其传递给第1层。

2 个答案:

答案 0 :(得分:5)

来自tf.train.Optimizer documentation

  

在应用渐变之前处理渐变。

     

调用minimize()负责计算渐变并将它们应用于变量。如果要在应用渐变之前处理渐变,则可以分三步使用优化器:

     

使用compute_gradients()计算渐变。   根据需要处理渐变。   使用apply_gradients()应用已处理的渐变。   例如:

# Create an optimizer.
opt = GradientDescentOptimizer(learning_rate=0.1)

# Compute the gradients for a list of variables.
grads_and_vars = opt.compute_gradients(loss, <list of variables>)

# grads_and_vars is a list of tuples (gradient, variable).  Do whatever you
# need to the 'gradient' part, for example cap them, etc.
capped_grads_and_vars = [(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars]

# Ask the optimizer to apply the capped gradients.
opt.apply_gradients(capped_grads_and_vars)

答案 1 :(得分:2)

您可能正在寻找public class BroadcastReceiverOneSignal extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getBundleExtra("data"); try { JSONObject customJSON = new JSONObject(extras.getString("custom")); if(customJSON.has("a")){ String id = customJSON.getJSONObject("a").getString(Constants.ID_CORRIDA); Intent i = new Intent(context, Activty.class); i.putExtra(Constants.ID, id); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } }catch (Exception e){ e.printStackTrace(); } } } tensorflow docs中有一个很好的例子:

tf.Graph.gradient_override_map

现实世界正在使用它here来通过量化权重在do-re-fa网络实现中传递实值梯度。