python - 在 Tensorflow 2 中乘以常数值的变量没有梯度
问题描述
我正在创建一个自定义层,将内核乘以一个常量掩码值。掩码是不可训练的,但内核是可训练的。但在我的实现中,内核的渐变消失了。关于如何使这项工作的任何建议?
class MaskedDense(Dense):
#Dense layer defined here:
#https://github.com/tensorflow/tensorflow/blob/v2.4.0/tensorflow/python/keras/layers/core.py#L1081-L1247
def __init__(self, units, mask_weight, mask_bias,
*args, **kwargs):
super(MaskedDense, self).__init__(units, *args, **kwargs)
self.mask_weight = mask_weight
self.mask_bias = mask_bias
def build(self, input_shape):
super(MaskedDense, self).build(input_shape)
self._underlying_kernel = self.kernel
self.kernel_mask = tf.Variable(initial_value=self.mask_weight, trainable=False, name='kernelmask', dtype='float32')
self._non_trainable_weights.append(self.kernel_mask)
self.kernel = tf.math.multiply(self._underlying_kernel, self.kernel_mask)
if self.use_bias:
self._underlying_bias = self.bias
self.bias_mask = tf.Variable(initial_value=self.mask_bias, trainable=False, name='biasmask', dtype='float32')
self._non_trainable_weights.append(self.bias_mask)
self.bias = tf.math.multiply(self._underlying_bias, self.bias_mask)
else:
self.bias = None
我在一个简单的模型中为每一层输入一个掩码数组,如下所示:
mask_model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
MaskedDense(128, activation='relu', mask_weight = mask[0], mask_bias = mask[1]),
MaskedDense(64, activation='relu', mask_weight = mask[2], mask_bias = mask[3]),
MaskedDense(10, mask_weight = mask[4], mask_bias = mask[5])
])
使用这个模型给了我所有None
的渐变。对使用原始层构建的模型使用相同的代码可以tensorflow.keras.layers.Dense
正常工作。
解决方案
推荐阅读
- php - 使用 AJAX jquery 验证表单的问题
- oracle - Oracle 使用临时表或其他方法
- java - 名称搜索程序问题。在解析 } 错误消息时获取“到达文件末尾”
- mysql - 如何从结果集方法返回整数
- authorization - 根据路径过滤
- javascript - SetInterval 循环直到找到元素
- javascript - 如何在一条语句中进行多个 SQL 查询(使用 Node)?
- android - 哪种 TextAppearance 样式与应用启动器图标下方的文本匹配?
- python - 为什么 beautifulsoup 没有为这张表返回任何内容?
- android - Firebase + Flutter - 云函数 onCall 导致 Android 应用出现“未经身份验证”错误