Функция Keras model.summary отображает текущий формат вывода - PullRequest
0 голосов
/ 31 января 2019

Я изучаю входы и выходы Кераса.Итак, в этом аспекте я проверял функцию model.summary().

Я использовал простой пример классификации изображений , предоставленный самим Keras, и загружал различные предоставленные предварительно обученные модели (Xception, VGG16 и т. Д.).

Я проверил архитектуру каждой модели, используя model.summary(), как упоминалось.Затем я заметил, что по какой-то причине столбец Connected to (то есть четвертый столбец) не присутствует в каждой сводке модели.Например, для 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       

Этот вывод выполняется безлюбые дополнительные действия после загрузки модели (без обучения, умозаключения и т. д.).

Это кажется странным, и я не уверен, что здесь происходит.Например, при создании этой простой модели из этого вопроса здесь (до части 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 голосов
/ 31 января 2019

Я предполагаю, что причина: 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 

( ссылка ).Как вы можете видеть, он просто не печатает 'Connected to' для последовательной модели.
Я думаю, причина в том, что последовательная модель не позволяет соединять слои в непоследовательном порядке - поэтому они просто подключеныпо одному.

Кроме того, он проверяет тип модели с помощью model.__class__.__name__ == 'Sequential' ( ссылка ).Я сомневаюсь, что это хорошая идея, пытаясь изменить его "на лету", чтобы получить другой результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...