trainable_variables Keras 中自定义图层的属性 returns 空列表
trainable_variables attribute of the custom layer in Keras returns empty list
我尝试在 tensorflow/keras
中构建我自己的自定义层,强制层是对称的,我最终得到的结果如下:
import tensorflow as tf
from tensorflow.python.framework.ops import enable_eager_execution
enable_eager_execution()
class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, num_outputs):
super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
def build(self, input_shape):
X = tf.random.uniform([int(input_shape[-1]),self.num_outputs],minval=0,maxval=1,dtype=tf.dtypes.float32,)
k = tf.Variable(X, name="kernel")
self.kernel = 0.5 * (k+tf.transpose(k))
def call(self, input):
return tf.matmul(input, self.kernel)
layer = MyDenseLayer(5)
print(layer(tf.ones([3, 5])))
print(layer.trainable_variables)
到目前为止,还不错。我不明白的是:为什么最后一行
print(layer.trainable_variables)
给我一个空列表:
[]
我认为 layer.trainable_variables
会告诉我我的矩阵是什么样子的,这样我就可以检查它是否对称。
您需要使用add_weight
添加变量,然后调用build()
方法来创建这个变量。或者,您可以传递一个输入(就像您在问题中所做的那样),而不是直接调用 build()
,它将隐式调用 build()
方法。
import tensorflow as tf
from tensorflow.python.framework.ops import enable_eager_execution
enable_eager_execution()
class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, num_outputs):
super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
def build(self, input_shape):
def initializer(*args, **kwargs):
X = tf.random.uniform([int(input_shape[-1]),self.num_outputs],minval=0,maxval=1,dtype=tf.dtypes.float32,)
kernel = 0.5 * (X+tf.transpose(X))
return kernel
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[-1], self.num_outputs),
initializer=initializer,
trainable=True)
super(MyDenseLayer, self).build(input_shape)
def call(self, input_):
return tf.matmul(input_, self.kernel)
layer = MyDenseLayer(5)
layer.build((5, )) # <-- example of input shape
print(layer.trainable_variables)
# [<tf.Variable 'kernel:0' shape=(5, 5) dtype=float32, numpy=
# array([[0.04476559, 0.8396935 , 0.42732996, 0.75126845, 0.7109113 ],
# [0.8396935 , 0.46617424, 0.71654373, 0.5770991 , 0.38461512],
# [0.42732996, 0.71654373, 0.75249636, 0.28733748, 0.6064501 ],
# [0.75126845, 0.5770991 , 0.28733748, 0.9417101 , 0.61572695],
# [0.7109113 , 0.38461512, 0.6064501 , 0.61572695, 0.6960379 ]],
# dtype=float32)>]
我尝试在 tensorflow/keras
中构建我自己的自定义层,强制层是对称的,我最终得到的结果如下:
import tensorflow as tf
from tensorflow.python.framework.ops import enable_eager_execution
enable_eager_execution()
class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, num_outputs):
super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
def build(self, input_shape):
X = tf.random.uniform([int(input_shape[-1]),self.num_outputs],minval=0,maxval=1,dtype=tf.dtypes.float32,)
k = tf.Variable(X, name="kernel")
self.kernel = 0.5 * (k+tf.transpose(k))
def call(self, input):
return tf.matmul(input, self.kernel)
layer = MyDenseLayer(5)
print(layer(tf.ones([3, 5])))
print(layer.trainable_variables)
到目前为止,还不错。我不明白的是:为什么最后一行
print(layer.trainable_variables)
给我一个空列表:
[]
我认为 layer.trainable_variables
会告诉我我的矩阵是什么样子的,这样我就可以检查它是否对称。
您需要使用add_weight
添加变量,然后调用build()
方法来创建这个变量。或者,您可以传递一个输入(就像您在问题中所做的那样),而不是直接调用 build()
,它将隐式调用 build()
方法。
import tensorflow as tf
from tensorflow.python.framework.ops import enable_eager_execution
enable_eager_execution()
class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, num_outputs):
super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
def build(self, input_shape):
def initializer(*args, **kwargs):
X = tf.random.uniform([int(input_shape[-1]),self.num_outputs],minval=0,maxval=1,dtype=tf.dtypes.float32,)
kernel = 0.5 * (X+tf.transpose(X))
return kernel
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[-1], self.num_outputs),
initializer=initializer,
trainable=True)
super(MyDenseLayer, self).build(input_shape)
def call(self, input_):
return tf.matmul(input_, self.kernel)
layer = MyDenseLayer(5)
layer.build((5, )) # <-- example of input shape
print(layer.trainable_variables)
# [<tf.Variable 'kernel:0' shape=(5, 5) dtype=float32, numpy=
# array([[0.04476559, 0.8396935 , 0.42732996, 0.75126845, 0.7109113 ],
# [0.8396935 , 0.46617424, 0.71654373, 0.5770991 , 0.38461512],
# [0.42732996, 0.71654373, 0.75249636, 0.28733748, 0.6064501 ],
# [0.75126845, 0.5770991 , 0.28733748, 0.9417101 , 0.61572695],
# [0.7109113 , 0.38461512, 0.6064501 , 0.61572695, 0.6960379 ]],
# dtype=float32)>]