Keras model.summary函数显示无关紧要的输出格式

时间:2019-01-31 14:23:45

标签: python keras

我正在研究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。

1 个答案:

答案 0 :(得分:2)

我想原因是:MobileNetV2已实现keras.Model,但MobileNet是keras.Sequential

ModelSequential都具有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)检查模型类型。我怀疑尝试“即时”更改以获得不同的输出是个好主意。