tensorflow - 如何防止某些权重的梯度计算
问题描述
我希望不会为某些权重计算梯度或将其设置为零。因为我不希望他们在培训期间更新。这是一个代码示例:
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_gradient
和tf.keras.backend.stop_gradient
。但不知道如何以及是否可以将它们应用于我的问题
解决方案
您可以使用layer.trainable = False
which 将停止在训练期间更改该层中的权重。
要获取模型中的层,您可以调用model.layers
并选择返回的对象中的第一层或第零层,然后将 trainable 设置为 false,例如:
layers = model.layers
layers[0].trainable = False
推荐阅读
- c++ - C++ QTextDocument::contentsChange() 信号提供了无效的输入数据
- batch-file - 为什么批处理文件中使用的命令 START 不启动批处理文件?
- twitter-bootstrap-3 - 递增/递减按钮问题
- python - 解压缩到标准输出时如何判断压缩图像的大小
- javascript - 你如何让一个 for 循环数组在 JavaScript 中给出一个单一的、非连续的输出?
- java - 如何转换 PNG<->JPEG<->TIFF 图像
- android - Anko ListItem setOnClickListener
- python - 无法在条目中写入全文 - tkinter
- css - 如何在 css 中制作响应式 45 度图像叠加层
- git - 如何查看修改文件内容(不是元数据)的所有提交?