提问者:小点点

自动调用build()方法在Tensorflow中创建层


我正在使用Tensorflow2构建一个带有自定义层模型

当我在__init__方法中声明自定义层时,我希望通过调用Build方法来自动创建input_shape

例如:

class CLayer(tf.keras.layers.Layer):
    def __init__(self, hidden_units):
        super(CLayer, self).__init__()
        self.dense_layers = [keras.layers.Dense(u) for u in hidden_units]

    def call(self, inputs):
        x = inputs
        for layer in self.dense_layers:
            x = layer(x)
        return x

c_layer_1 = CLayer(hidden_units=[2,4])
# clayer is still call `build()` method so c_layer_1 don't have `input_shape` for each layer in c_layer_1
c_layer_1.get_weights() # return [] 

c_layer_1.get_weights()返回不带权重的列表。 但是当我手动调用build()方法时,它会返回我所期望的层权重。

c_layer_2 = CLayer(hidden_units=[2,4])

input_arr = np.random.rand(1,2).astype(dtype=np.float32)
c_layer_2(input_arr)
c_layer_2.get_weights() 
#return [array([[ 0.30477905, -0.7402924 ],
#        [ 0.63039017,  0.33198082]], dtype=float32),
# array([0., 0.], dtype=float32),
# array([[ 0.49092817,  0.5744488 ,  0.7653606 ,  0.36842155],
#        [ 0.20108438,  0.68443155, -0.589319  , -0.92959046]],
#       dtype=float32),
# array([0., 0., 0., 0.], dtype=float32)]

我怎么解决这个问题? 谢谢你的帮助!


共1个答案

匿名用户

试试看

for layer in self.dense_layers:
    x = layer()(x)