Изменение формы ввода полностью сверточной сети в TF 2.3 и tf.keras

#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 ссылка, которую я вам дал, является примером повторного использования модели с другим ipput

5. Я легко понимаю, как замораживать слои. Однако я не понимаю, как подключить к существующей модели, которую я создал (а не к одной из тех, которые уже присутствуют в keras, как они делают в вашей ссылке), другой слой! Я имею в виду… Я понял, как подключить слой к существующему выводу, но не как ввести другой ввод после удаления нескольких слоев