我正在研究Keras的来龙去脉。因此,在这方面,我正在检查model.summary()
函数。
我使用的是Keras本身提供的简单image classification example,并加载了提供的各种预训练模型(Xception,VGG16等)。
如上所述,我使用model.summary()
检查了每个模型架构。然后,我注意到由于某些原因,并不是每个模型摘要都显示Connected to
列(即第4列)。例如,对于MobileNetV2
,我得到了(只显示了前几行):
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) (None, 224, 224, 3) 0
__________________________________________________________________________________________________
Conv1_pad (ZeroPadding2D) (None, 225, 225, 3) 0 input_1[0][0]
__________________________________________________________________________________________________
Conv1 (Conv2D) (None, 112, 112, 32) 864 Conv1_pad[0][0]
但是对于MobileNet
,我得到了:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 224, 224, 3) 0
_________________________________________________________________
conv1_pad (ZeroPadding2D) (None, 225, 225, 3) 0
_________________________________________________________________
conv1 (Conv2D) (None, 112, 112, 32) 864
在模型加载后无需任何额外操作即可执行此输出(无训练,无推断等)。
这似乎很奇怪,我不确定这是怎么回事。例如,根据问题here(最多model0.fit(...)
部分)创建此简单模型并运行model0.summary()
时,我得到的摘要没有Connected to
列,这与发布的摘要相反这个问题。
那么,这个改变到输出了吗? model.summary()
处理什么?我们对输出有一定的控制权吗(尽管上面的示例并不暗示这一点)?还是输出与模型的结构方式有关?
编辑:
我添加了一个(平凡的)代码,用于根据评论的要求重现两个模型的摘要。
from keras.applications.mobilenet_v2 import MobileNetV2
from keras.applications.mobilenet import MobileNet
model1 = MobileNetV2(weights='imagenet')
print(model1.summary())
model2 = MobileNet(weights='imagenet')
print(model2.summary())
此外,如果这些信息在某种程度上有用的话,我的系统将使用Keras 2.2.4,Tensorflow 1.12.0和Ubuntu 16.04。
答案 0 :(得分:2)
我想原因是:MobileNetV2
已实现keras.Model
,但MobileNet是keras.Sequential
。
Model
和Sequential
都具有summary
方法。在运行时,它会调用print_summary
方法,该方法在类似顺序的模型和非顺序模型中的作用不同:
if sequential_like:
line_length = line_length or 65
positions = positions or [.45, .85, 1.]
if positions[-1] <= 1:
positions = [int(line_length * p) for p in positions]
# header names for the different log elements
to_display = ['Layer (type)', 'Output Shape', 'Param #']
else:
line_length = line_length or 98
positions = positions or [.33, .55, .67, 1.]
if positions[-1] <= 1:
positions = [int(line_length * p) for p in positions]
# header names for the different log elements
to_display = ['Layer (type)',
'Output Shape',
'Param #',
'Connected to']
relevant_nodes = []
for v in model._nodes_by_depth.values():
relevant_nodes += v
(link)。如您所见,对于类似顺序的模型,它只是不会打印'Connected to'
。
我猜想原因是顺序模型不允许按非顺序顺序连接图层-因此,它们只是一个接一个地连接。
此外,它还通过model.__class__.__name__ == 'Sequential'
(link)检查模型类型。我怀疑尝试“即时”更改以获得不同的输出是个好主意。