我正在尝试从tf.keras.layers.Layer继承来在tensorflow中实现一个嘈杂的线性层。除了重用变量外,其他所有东西都工作正常。这似乎是由于范围的问题而引起的:每当我使用超类中的add_weight函数并且已经存在具有相同名称的权重时,它似乎会忽略范围中给定的重用标志,而是创建一个新变量。有趣的是,在类似情况下,它没有像往常一样在变量名末尾添加1,而是在范围名前添加1。
import tensorflow as tf
class NoisyDense(tf.keras.layers.Layer):
def __init__(self,output_dim):
self.output_dim=output_dim
super(NoisyDense, self).__init__()
def build(self, input_shape):
self.input_dim = input_shape.as_list()[1]
self.noisy_kernel = self.add_weight(name='noisy_kernel',shape= (self.input_dim,self.output_dim))
def noisydense(inputs, units):
layer = NoisyDense(units)
return layer.apply(inputs)
inputs = tf.placeholder(tf.float32, shape=(1, 10),name="inputs")
scope="scope"
with tf.variable_scope(scope):
inputs3 = noisydense(inputs,
1)
my_variable = tf.get_variable("my_variable", [1, 2, 3],trainable=True)
with tf.variable_scope(scope, reuse=tf.AUTO_REUSE):
inputs2 = noisydense(inputs,
1)
my_variable = tf.get_variable("my_variable", [1, 2, 3],trainable=True)
tvars = tf.trainable_variables()
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
tvars_vals = sess.run(tvars)
for var, val in zip(tvars, tvars_vals):
print(var.name, val)
这将导致变量
scope/noisy_dense/noisy_kernel:0
scope_1/noisy_dense/noisy_kernel:0
scope/my_variable:0
被打印。我希望它可以重用嘈杂的内核,而不是像my_variable那样创建第二个内核。