这是创建keras模型的两种方法,但是这两种方法的summary结果中输出形状
是不同的。显然,前一种方法打印了更多信息,更容易检查网络的正确性。
import tensorflow as tf
from tensorflow.keras import Input, layers, Model
class subclass(Model):
def __init__(self):
super(subclass, self).__init__()
self.conv = layers.Conv2D(28, 3, strides=1)
def call(self, x):
return self.conv(x)
def func_api():
x = Input(shape=(24, 24, 3))
y = layers.Conv2D(28, 3, strides=1)(x)
return Model(inputs=[x], outputs=[y])
if __name__ == '__main__':
func = func_api()
func.summary()
sub = subclass()
sub.build(input_shape=(None, 24, 24, 3))
sub.summary()
输出:_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 24, 24, 3) 0
_________________________________________________________________
conv2d (Conv2D) (None, 22, 22, 28) 784
=================================================================
Total params: 784
Trainable params: 784
Non-trainable params: 0
_________________________________________________________________
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) multiple 784
=================================================================
Total params: 784
Trainable params: 784
Non-trainable params: 0
_________________________________________________________________
那么,我应该如何使用子类化方法在summary()中获取输出形状
?
outputs=self.call(x)
这部分。 - Gilfoyleoutputs=self.call(x)
,会调用subclass.call(self, x)
方法。这会触发封装实例中的形状计算。此外,Model
返回的实例也会计算自己的形状,并在.summary()
中报告。这种方法的主要问题是输入形状是常量shape=(24, 24, 3)
,因此如果需要动态解决方案,这种方法无法使用。 - Rob Hall...
中放了什么吗?这是一个通用的解决方案还是需要在这些调用中使用特定于模型的东西? - GuySoftsummary
函数不是更好/更容易吗?即,def summary(self):
x = ...
dummy_model = Model(...
dummy_model.summary
。你甚至可以将形状作为新摘要函数的输入变量。 - Lu Kasdummy_model.summary()
。 - Lu Kas