Я использую API подклассов для создания простой сети конверсии, и я хочу использовать метод сводки, чтобы получить представление о том, как выглядит архитектура моей модели. Однако, когда я вызываю model.summary(), слои выходят из строя, и вывод форма тоже не показана. Есть ли чистый способ обойти это? или мне нужно переопределить метод model.summary() в классе модели.
Вот рассматриваемые слои:
class thing(keras.Model):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.conv1 = keras.layers.convolutional.Conv2D(96,
kernel_size= (11, 11),
strides= 4,
activation = "relu",
data_format = "channels_last",
input_shape= (277,277, 3))
self.flatten = keras.layers.Flatten(data_format = "channels_last")
self.dense = keras.layers.Dense(4096, activation= "relu")
self.pool = keras.layers.pooling.MaxPooling2D(pool_size= (3,3), strides = 2,
data_format = "channels_last")
def call(self, inputs):
conv1 = self.conv1(inputs)
pool1 = self.pool(conv1)
flatten_conv = self.flatten(pool1)
ff_1 = self.dense(flatten_conv)
return ff_1
a = thing()
a.build(input_shape=(None, 277, 277, 3))
a.summary()
OUTPUT:
Model: "thing_9"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_9 (Conv2D) multiple 34944
_________________________________________________________________
flatten_9 (Flatten) multiple 0
_________________________________________________________________
dense_14 (Dense) multiple 415240192
_________________________________________________________________
max_pooling2d_9 (MaxPooling2 multiple 0
=================================================================
Total params: 415,275,136
Trainable params: 415,275,136
Non-trainable params: 0
_________________________________________________________________
Функция model.summary
использует функцию tensorflow.python.keras.utils.layer_utils.print_summary для печати информации о структуре модели, она перебирает model.layer
для печати информации обо всех слоях, а model.layer
представляет собой список, содержащий все слои, которые вы определенный в модели (т. е. с помощью self.
), порядок слоев в этом списке определяется порядком, в котором вы определяете слои.
Таким образом, вы можете определить слои в том же порядке, в котором вы вызываете слои (хотя вы не получите информацию о соединении слоев и форме вывода слоев), или вы можете обойти это, определив простую сводную функцию внутри вашего пользовательского класса модели:
def summary_model(self):
inputs = keras.Input(shape=(277, 277, 3))
outputs = self.call(inputs)
keras.Model(inputs=inputs, outputs=outputs, name = "thing").summary()
и вызовите его, используя:
a.summary_model()
который выводит:
Model: "thing"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 277, 277, 3)] 0
_________________________________________________________________
conv2d (Conv2D) (None, 67, 67, 96) 34944
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 33, 33, 96) 0
_________________________________________________________________
flatten (Flatten) (None, 104544) 0
_________________________________________________________________
dense (Dense) (None, 4096) 428216320
=================================================================
Total params: 428,251,264
Trainable params: 428,251,264
Non-trainable params: 0
_________________________________________________________________
Рад помочь, да, определил новую модель по порядку call
каждого слоя, а затем резюмировал эту модель.
Да, это имеет смысл, это действительно эффективный способ сделать резюме.
Это хорошо работает, спасибо! Я должен был посмотреть источник, а не только документацию, прежде чем задавать свой вопрос. Просто чтобы уточнить, пользовательская функция, которую вы определили, использует функциональный API для объявления модели, и вы используете эту модель для вывода сводки?