извлечение узких мест с помощью предварительно обученного Inceptionv3-различия между реализацией Keras и собственной реализацией Tensorflow
(извинения за длинный пост)
Все,
Я хочу использовать узкие места из предварительно подготовленной модели Inceptionv3 для прогнозирования классификации для моих входных изображений. Перед обучением модели и прогнозированием классификации я попробовал 3 различных подхода для извлечения узких мест.
Мои 3 подхода дали различные характеристики узкого места (не только по значениям, но даже по размеру).
Размер моих узких мест из Подход 1 и 2: (количество входных изображений) x 3 x 3 x 2048
Размер моих узких мест из подхода 3: (количество входных изображений) x 2048
Почему размеры отличаются между моделью Inceptionv3 на основе Keras и моделью native Tensorflow? Я предполагаю,что когда я говорю include_top=False в Keras, я не извлекаю слой 'pool_3/_reshape:0'. Это правильно? Если да, то как извлечь слой 'pool_3/_reshape:0' в Keras? Если мое предположение неверно, то кто я? пропал?
Я сравнил значения характеристик узких мест в подходах 1 и 2, и они существенно отличались. Я думаю, что я кормлю его теми же входными изображениями, потому что я изменяю размер и масштаб моих изображений, прежде чем я даже прочитаю его в качестве входных данных для моего сценария. У меня нет опций для моего ImageDataGenerator в подходе 1, и в соответствии с документацией для этой функции все значения по умолчанию не изменяют мое входное изображение. Я установил shuffle в false, поэтому я предположил, что predict_generator и предсказатели читают изображения в том же порядке. Чего мне не хватает?
Пожалуйста, обратите внимание:
Мои входные изображения находятся в формате RGB (так что количество каналов = 3), и я изменил их размер до 150x150. Я использовал функцию preprocess_input в inceptionv3.py для предварительной обработки всех моих изображений.
def preprocess_input(image):
image /= 255.
image -= 0.5
image *= 2.
return image
Подход 1: используется в водоснабжении с tensorflow как бэкэнд, в ImageDataGenerator читать мои и модели данных.predict_generator для вычисления узкого места особенности
Я следовал примеру (раздел , используя узкие места предварительно обученной сети: точность 90% в минуту) из блога Кераса. Вместо модели VGG, указанной там, я использовал Inceptionv3. Ниже приведен фрагмент кода, который я использовал
(код не показан здесь, но то, что я сделал до кода ниже): прочитайте все входные изображения, измените размер до 150x150x3, масштабируйте в соответствии с функцией preprocessing_input, упомянутой выше, сохраните размер и масштабирование. изображения
train_datagen = ImageDataGenerator()
train_generator = train_datagen.flow_from_directory(my_input_dir, target_size=(150,150),shuffle=False, batch_size=16)
# get bottleneck features
# use pre-trained model and exclude top layer - which is used for classification
pretrained_model = InceptionV3(include_top=False, weights='imagenet', input_shape=(150,150,3))
bottleneck_features_train_v1 = pretrained_model.predict_generator(train_generator,len(train_generator.filenames)//16)
2 подхода: используется в водоснабжении с tensorflow в качестве бэкэнда, мой читатель и модель.прогнозирование для вычисления узких мест
Единственная разница между этим подходом и предыдущим заключается в том, что я использовал свой собственный ридер для чтения входных изображений.
(код не показан здесь, но то, что я сделал перед кодом ниже): прочитайте все входные изображения, измените размер до 150x150x3, масштабируйте в соответствии с функцией preprocessing_input, упомянутой выше, сохраните размер и масштабирование изображения
# inputImages is a numpy array of size <number of input images x 150 x 150 x 3>
inputImages = readAllJPEGsInFolderAndMergeAsRGB(my_input_dir)
# get bottleneck features
# use pre-trained model and exclude top layer - which is used for classification
pretrained_model = InceptionV3(include_top=False, weights='imagenet', input_shape=(img_width, img_height, 3))
bottleneck_features_train_v2 = pretrained_model.predict(trainData.images,batch_size=16)
Подход 3: используемый tensorflow (без KERAS) вычисляет узкие места
Я последовал за ним retrain.py для извлечения узких мест для моих входных изображений. Обратите внимание, что веса из этого скрипта можно получить из (http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz )
Как уже упоминалось в этом примере, я использовал bottleneck_tensor_name = 'pool_3/_reshape:0' в качестве слоя для извлечения и вычисления bottleneck особенности. Подобно первым 2 подходам, я использовал измененные и масштабированные изображения в качестве входных данных для скрипта и назвал этот список функций bottleneck_features_train_v3
Большое Спасибо
2 ответов:
Различные результаты между 1 и 2
Поскольку вы не показали свой код, я (возможно, ошибочно) предполагаю, что проблема в том, что вы, возможно, не использовали
preprocess_inputпри объявленииImageDataGenerator?Однако убедитесь, что сохраненные файлы изображений находятся в диапазоне от 0 до 255. (Разрядность 24).from keras.applications.inception_v3 import preprocess_input train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)Различные формы между 1 и 3
В этом случае возможны три типа моделей:
include_top = True- > это вернет классыinclude_top = False(только) - >это подразумевает вpooling = None(без конечного слоя объединения)include_top = False, pooling='avg'или='max'- > имеет слой объединенияИтак, ваша объявленная модель без явного
pooling=somethingне имеет конечного слоя объединения в keras. Тогда выходы по-прежнему будут иметь пространственные размеры.Решите это, просто добавив объединение в конце. Один из них:
pretrained_model = InceptionV3(include_top=False, pooling = 'avg', weights='imagenet', input_shape=(img_width, img_height, 3)) pretrained_model = InceptionV3(include_top=False, pooling = 'max', weights='imagenet', input_shape=(img_width, img_height, 3))Не уверен, какую модель использует файл
tgz.В качестве альтернативы вы также можете получить другой слой из модели тензорного потока, которая идет непосредственно перед
'pool_3'.
Вы можете посмотреть на реализацию Keras inceptionv3 здесь: https://github.com/keras-team/keras/blob/master/keras/applications/inception_v3.py
Итак, параметр по умолчанию:
def InceptionV3(include_top=True, weights='imagenet', input_tensor=None, input_shape=None, pooling=None, classes=1000):Обратите внимание, что по умолчанию для пула=None, то при построении модели код будет:
if include_top: # Classification block x = GlobalAveragePooling2D(name='avg_pool')(x) x = Dense(classes, activation='softmax', name='predictions')(x) else: if pooling == 'avg': x = GlobalAveragePooling2D()(x) elif pooling == 'max': x = GlobalMaxPooling2D()(x) # Ensure that the model takes into account # any potential predecessors of `input_tensor`. if input_tensor is not None: inputs = get_source_inputs(input_tensor) else: inputs = img_input # Create model. model = Model(inputs, x, name='inception_v3')Таким образом, если вы не задаете пул, функция bottleneck извлекается без какого-либо пула, вам нужно указать, хотите ли вы получить средний пул или максимальный пул поверх эта особенность.
Comments