#python #tensorflow #keras
#машинное обучение #глубокое обучение #искусственный интеллект #conv-нейронная сеть #контролируемое обучение
Вопрос:
Я работаю над проблемой классификации, используя CNN
размер моего входного изображения 64X64
, и я хочу использовать предварительно подготовленную модель, такую как VGG16, COCO или любую другую. Но проблема в том, что размер входного изображения предварительно подготовленной модели равен 224X224
. Как мне решить эту проблему. Есть ли какой-либо способ увеличения данных для размера входного изображения.
Если я изменю размер своего входного изображения 224X224
, то очень высока вероятность того, что изображение станет размытым, и это может повлиять на обучение. Пожалуйста, поправьте меня, если я ошибаюсь.
Другой вопрос связан с предварительно подготовленной моделью. Если я использую transfer learning
, то, как правило, сколько слоев я должен заморозить из предварительно подготовленной модели. Учитывая, что моя классификация сильно отличается от предварительно подготовленных классов моделей. Но я думаю, что первые несколько слоев мы можем заморозить, чтобы получить края, кривую и т. Д. Изображений, Что очень часто встречается на всех изображениях.
Ответ №1:
Но проблема в том, что размер входного изображения предварительно подготовленной модели составляет 224X224.
Я предполагаю, что вы работаете с Keras
/ Tensorflow
(это то же самое для других фреймворков DL). Согласно документам в приложении Keras:
input_shape: необязательный кортеж формы, который указывается только в том случае, если include_top имеет значение False (в противном случае форма ввода должна быть (224, 224, 3) (с форматом данных ‘channels_last’) или (3, 224, 224) (с форматом данных ‘channels_first’).). У него должно быть ровно 3 входных канала, а ширина и высота должны быть не меньше 48. Например. (200, 200, 3) будет один
Итак, есть два варианта решения вашей проблемы:
- Измените размер вашего входного изображения на
244*244
по существующей библиотеке и используйте классификатор VGG [include_top=True
]. - Создайте свой собственный классификатор поверх моделей VGG. Как упоминалось в приведенной выше документации,
Keras
если ваше изображение отличается от 244 * 244, вам следует подготовить свой собственный классификатор[include_top=False]
. Вы можете легко делать такие вещи с:inp = keras.layers.Input(shape=(64, 64, 3), name='image_input') vgg_model = VGG19(weights='imagenet', include_top=False) vgg_model.trainable = False x = keras.layers.Flatten(name='flatten')(vgg_model) x = keras.layers.Dense(512, activation='relu', name='fc1')(x) x = keras.layers.Dense(512, activation='relu', name='fc2')(x) x = keras.layers.Dense(10, activation='softmax', name='predictions')(x) new_model = keras.models.Model(inputs=inp, outputs=x) new_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
Если я использую обучение передаче, то, как правило, какие слои я должен
заморозить из предварительно подготовленной модели
Это действительно зависит от того, какова ваша новая задача, сколько у вас обучающих примеров, какова ваша предварительно подготовленная модель и многое другое. На вашем месте я бы сначала выбросил классификатор предварительно подготовленной модели. Затем, если не сработало, удалите какой-нибудь другой слой свертки и делайте это шаг за шагом, пока я не получу хорошую производительность.
Комментарии:
1. 1) Изменение размера изображения может привести к потере характеристик изображения. Пожалуйста, поправьте меня, если я ошибаюсь.
2. 2) Извините, я новичок в глубоком обучении. Что означает строка ниже 2? Таким образом, мы не используем верхний уровень моделей VGG. Затем, не могли бы вы объяснить, как модель VGG влияет на слои, которые вы определили выше. vgg_model = VGG19(weights= ‘imagenet’, include_top=False) vgg_model.trainable = False
3. @PankajKumar изменение изображения с 64 на 244 является рискованным, в результате вы, вероятно, потеряете некоторые функции. В этих двух строках сначала я загружаю предварительно обученную модель (VGG) и замораживаю модель (она не поддается обучению). Вы обучили только классификатор, а не всю модель.
4. Привет, у меня такая же проблема, вы ее решили? Например, у меня есть предварительно подготовленные веса для изображений размером 64 * 64 пикселей. Я хотел бы провести обучение передаче на новых изображениях с разрешением 128 * 128 пикселей. Как я могу это сделать? аналогично 2)? а как насчет пространственного размера?
Ответ №2:
Следующий код работает для меня для размера изображения 128*128*3:
vgg_model = VGG16(include_top=False, weights='imagenet')
print(vgg_model.summary())
#Get the dictionary of config for vgg16
vgg_config = vgg_model.get_config()
vgg_config["layers"][0]["config"]["batch_input_shape"] = (None, 128, 128, 3)
vgg_updated = Model.from_config(vgg_config)
vgg_updated.trainable = False
model = Sequential()
# Add the vgg convolutional base model
model.add(vgg_updated)
# Flattedn Layer must be added
model.add(Flatten())
vgg_updated.summary()
model.summary()