#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:
Вы могли бы предпринять следующие шаги:
- извлеките слои модели
- получите как входной слой, так и желаемый новый выходной слой (в вашем случае те функции, которые вы хотите)
- перестроить модель
Пример, который подчеркивает это:
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 Конечно, рад помочь!