#tensorflow #keras #deep-learning #tf.keras
#tensorflow #keras #глубокое обучение #tf.keras
Вопрос:
Я работаю с tensorflow 2.3 и tf.keras
Я обучил сеть изображениям с формой ввода (None,120,120,12)
. На самом деле я также смог обучить модель, объявляя ввод как (None,128,128,12)
при подаче (None,120,120,12)
пакетов из-за ошибки кодирования. TF просто распечатал предупреждение и ему было все равно. Такого поведения не было в предыдущих версиях. В моей сети есть только сверточные слои, и, если размер ввода имеет достаточную степень 2 с учетом глубины, он обеспечивает выходное изображение той же формы, что и вход, оно имеет только сверточные слои.
Я, наконец, полностью обучил эту модель, и я хотел бы применить ее также к изображениям другой формы. Есть ли правильный способ изменить форму ввода моей обученной модели? Или я должен определить новую модель, а затем скопировать веса слой за слоем? Или я должен просто забыть об этом и просто принять предупреждения и забыть о них, поскольку это все равно работает?
Ответ №1:
ах. Снова ты. Я думаю, что ваша проблема в основном проста. После того, как вы обучите свою модель с размером ввода. Если вы хотите запустить модель, входные данные должны иметь ту же форму. Однако, если вы хотите воспользоваться преимуществами обученной модели и считаете, что изученные функции не сильно отличаются, тогда вы можете применить transferlearning и, конечно, переобучить его снова. Вам не нужно копировать веса, просто заморозьте модель и обучите только ввод и вывод. Вы можете проверить это на каком-нибудь базовом примере с вашим VGG
base_model = tensorflow.keras.applications.VGG19(
weights='imagenet', # Load weights pre-trained on ImageNet.
input_shape=(224, 224, 3),
include_top=False)
base_model.trainable = False
inputs = layers.Input(shape=150,150,3)
x = base_model(inputs, training=False)
x = keras.layers.GlobalAveragePooling2D()(x)
outputs = keras.layers.Dense(1)(x)
model = keras.Model(inputs, outputs)
model.summary()
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_4 (InputLayer) [(None, 150, 150, 3)] 0
_________________________________________________________________
vgg19 (Model) multiple 20024384
_________________________________________________________________
global_average_pooling2d (Gl (None, 512) 0
_________________________________________________________________
dense (Dense) (None, 1) 513
=================================================================
Комментарии:
1. Нет, входные данные не обязательно должны быть одинаковой формы. Действительно, теперь в TF2.3 я могу обучить модель на 128×128, и она будет работать на 256×256 только с предупреждением (и хорошей точностью). У меня нет плотного слоя, поэтому нет несоответствия размеров. Я несколько раз читал ссылку, которую вы дали здесь, но она применима только к моделям, которые предоставляет keras, в то время как у меня есть своя!
2. хорошая точность странная, но, по вашим словам, ваша модель не имеет плотных слоев, поэтому она разумна. Однако, как я только что предложил, лучше воспользоваться замораживанием модели вместо копирования слоев по слоям,
3. Есть причины, по которым я ожидаю приличной точности, специфичной для моей проблемы (микроскопия с фиксированным размером пикселя, 128×128 — патчи, 256×256 — целое изображение). Но это в основном не связано с программированием. Итак, как мне «заморозить» мою модель. Веса в любом случае не обновляются при выводе. Я не могу найти способ сказать, изменить размер ввода модели для произвольной модели
4. Вам просто нужно объявить входной слой с другой формой и соединить его с выбранными вами слоями замораживания. Вы можете выбрать диапазон слоев для замораживания:
for layer in vgg_conv.layers[:]: layer.trainable = False
ссылка, которую я вам дал, является примером повторного использования модели с другим ipput5. Я легко понимаю, как замораживать слои. Однако я не понимаю, как подключить к существующей модели, которую я создал (а не к одной из тех, которые уже присутствуют в keras, как они делают в вашей ссылке), другой слой! Я имею в виду… Я понял, как подключить слой к существующему выводу, но не как ввести другой ввод после удаления нескольких слоев