我正在使用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)]
我怎么解决这个问题? 谢谢你的帮助!
试试看
for layer in self.dense_layers:
x = layer()(x)