簡體   English   中英

Keras中自定義層的trainable_variables屬性返回空列表

[英]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() ,它會隱式調用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)>]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM