3 回答
TA贡献1852条经验 获得超1个赞
我已经用这个方法解决了这个问题,不知道有没有更简单的方法。
class subclass(Model):
def __init__(self):
...
def call(self, x):
...
def model(self):
x = Input(shape=(24, 24, 3))
return Model(inputs=[x], outputs=self.call(x))
if __name__ == '__main__':
sub = subclass()
sub.model().summary()
TA贡献1786条经验 获得超11个赞
我想关键点是_init_graph_network
类中的方法Network
,它是Model
. _init_graph_network
如果在调用方法时指定inputs
和outputs
参数,将被调用__init__
。
所以会有两种可能的方法:
手动调用
_init_graph_network
方法构建模型图。用输入层和输出重新初始化。
并且这两种方法都需要输入层和输出(从 需要self.call
)。
现在调用summary
将给出确切的输出形状。但是它会显示Input
层,它不是子类模型的一部分。
from tensorflow import keras
from tensorflow.keras import layers as klayers
class MLP(keras.Model):
def __init__(self, input_shape=(32), **kwargs):
super(MLP, self).__init__(**kwargs)
# Add input layer
self.input_layer = klayers.Input(input_shape)
self.dense_1 = klayers.Dense(64, activation='relu')
self.dense_2 = klayers.Dense(10)
# Get output layer with `call` method
self.out = self.call(self.input_layer)
# Reinitial
super(MLP, self).__init__(
inputs=self.input_layer,
outputs=self.out,
**kwargs)
def build(self):
# Initialize the graph
self._is_graph_network = True
self._init_graph_network(
inputs=self.input_layer,
outputs=self.out
)
def call(self, inputs):
x = self.dense_1(inputs)
return self.dense_2(x)
if __name__ == '__main__':
mlp = MLP(16)
mlp.summary()
输出将是:
Model: "mlp_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 16)] 0
_________________________________________________________________
dense (Dense) (None, 64) 1088
_________________________________________________________________
dense_1 (Dense) (None, 10) 650
=================================================================
Total params: 1,738
Trainable params: 1,738
Non-trainable params: 0
_________________________________________________________________
TA贡献2051条经验 获得超10个赞
我解决问题的方式与Elazar提到的非常相似。覆盖类中的函数 summary() subclass。然后您可以在使用模型子类化时直接调用 summary() :
class subclass(Model):
def __init__(self):
...
def call(self, x):
...
def summary(self):
x = Input(shape=(24, 24, 3))
model = Model(inputs=[x], outputs=self.call(x))
return model.summary()
if __name__ == '__main__':
sub = subclass()
sub.summary()
添加回答
举报