首页 > 解决方案 > 如何防止某些权重的梯度计算

问题描述

我希望不会为某些权重计算梯度或将其设置为零。因为我不希望他们在培训期间更新。这是一个代码示例:

 import tensorflow as tf
 import tensorflow.contrib.eager as tfe
 import numpy as np

 tf.enable_eager_execution()


 model = tf.keras.Sequential([
   tf.keras.layers.Dense(2, activation=tf.sigmoid, input_shape=(2,)),
   tf.keras.layers.Dense(2, activation=tf.sigmoid)
 ])


 #set the weights
 weights=[np.array([[0, 0.25],     [0.2,0.3]]),np.array([0.35,0.35]),np.array([[0.4,0.5],[0.45, 0.55]]),np.array([0.6,0.6])]

 model.set_weights(weights)

 model.get_weights()

 features = tf.convert_to_tensor([[0.05,0.10 ]])
 labels =  tf.convert_to_tensor([[0.01,0.99 ]])

 #define the loss function
 def loss(model, x, y):
   y_ = model(x)
   return tf.losses.mean_squared_error(labels=y, predictions=y_)

 #define the gradient calculation
 def grad(model, inputs, targets):
   with tf.GradientTape() as tape:
     loss_value = loss(model, inputs, targets)
   return loss_value, tape.gradient(loss_value, model.trainable_variables) 

 #create optimizer an global Step
 optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
     global_step = tf.train.get_or_create_global_step()

我希望第一个权重为 0 不应该包含在梯度计算中。我发现tf.stop_gradienttf.keras.backend.stop_gradient。但不知道如何以及是否可以将它们应用于我的问题

标签: tensorflowkerasneural-network

解决方案


您可以使用layer.trainable = False which 将停止在训练期间更改该层中的权重。

要获取模型中的层,您可以调用model.layers并选择返回的对象中的第一层或第零层,然后将 trainable 设置为 false,例如:

      layers =  model.layers
      layers[0].trainable = False 

推荐阅读