Удаление слоев / извлечение объектов из определенных слоев в TensorFlow 2.x

#python #python-3.x #tensorflow #tensorflow2.0

#python #python-3.x #tensorflow #tensorflow2.0

Вопрос:

У меня есть обученная модель CNN, где я применил плотный слой в качестве верхней модели для прогнозирования. Однако теперь я хочу использовать предпоследний слой для извлечения объектов, но я не могу удалить последний слой.

Я пробовал .pop, но, похоже, это больше не работает.

моя модель следующая:

input_1 (InputLayer) [(Нет, 256, 256, 3)] 0
_________________________________________________________________ efficientnet-b6 (Функциональный) (Отсутствует, 8, 8, 2304) 40960136
_________________________________________________________________ global_average_pooling2d (Gl (Нет, 2304) 0
_________________________________________________________________ плотный (Плотный)(Нет, 1) 2305
================================================================= Всего параметров: 40 962 441 Обучаемых параметров: 0 Необучаемых параметров: 40 962 441

и я хочу удалить плотную часть.

Ответ №1:

Вы могли бы предпринять следующие шаги:

  1. извлеките слои модели
  2. получите как входной слой, так и желаемый новый выходной слой (в вашем случае те функции, которые вы хотите)
  3. перестроить модель

Пример, который подчеркивает это:

 import tensorflow as tf
from tensorflow.keras import layers, models


def simpleMLP(in_size, hidden_sizes, num_classes, dropout_prob=0.5):
    in_x = layers.Input(shape=(in_size,))
    hidden_x = models.Sequential(name="hidden_layers")
    for i, num_h in enumerate(hidden_sizes):
        hidden_x.add(layers.Dense(num_h, input_shape=(in_size,) if i == 0 else []))
        hidden_x.add(layers.Activation('relu'))
        hidden_x.add(layers.Dropout(dropout_prob))
    out_x1 = layers.Dense(num_classes, activation='softmax', name='baseline1')
    out_x2 = layers.Dense(3, activation='softmax', name='baseline2')
    return models.Model(inputs=in_x, outputs=out_x2(out_x1((hidden_x(in_x)))))

baseline_mdl = simpleMLP(28*28, [500, 300], 10)
print(baseline_mdl.summary())
  

Модель: «functional_1»
_________________________________________________________________
Слой (тип) Параметр формы вывода #
=================================================================
input_1 (InputLayer) [(None, 784)] 0
_________________________________________________________________
hidden_layers (последовательный) (нет, 300) 542800
_________________________________________________________________
базовая линия 1 (плотная) (нет, 10) 3010
_________________________________________________________________
базовая линия2 (плотная) (нет, 3) 33
=================================================================
Всего параметров: 545 843
Обучаемые параметры: 545 843
Необучаемые параметры: 0
_________________________________________________________________

 baseline_in = baseline_mdl.layers[0].input
baseline_out = baseline_mdl.layers[-2].output
new_baseline = models.Model(inputs=baseline_in,
                            outputs=baseline_out)
print(new_baseline.summary())
  

Модель: «functional_3»
_________________________________________________________________ Слой (тип) Параметр формы вывода #
================================================================= input_1 (InputLayer) [(None, 784)] 0
_________________________________________________________________ hidden_layers (последовательный) (нет, 300) 542800
_________________________________________________________________ базовая линия 1 (плотная) (нет, 10) 3010
================================================================= Всего параметров: 545 810 обучаемых параметров: 545 810 необучаемых параметров:
0


Как вы можете видеть, я удалил последний слой и все еще могу использовать обученные веса.

Обратите внимание, что это может немного отличаться в зависимости от вашей модели, но это общие принципы, которым вы должны следовать и корректировать.

Комментарии:

1. @Alexandros Конечно, рад помочь!