извлечение узких мест с помощью предварительно обученного Inceptionv3-различия между реализацией Keras и собственной реализацией Tensorflow



(извинения за длинный пост)



Все,



Я хочу использовать узкие места из предварительно подготовленной модели Inceptionv3 для прогнозирования классификации для моих входных изображений. Перед обучением модели и прогнозированием классификации я попробовал 3 различных подхода для извлечения узких мест.



Мои 3 подхода дали различные характеристики узкого места (не только по значениям, но даже по размеру).





  1. Размер моих узких мест из Подход 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? Если мое предположение неверно, то кто я? пропал?




  2. Я сравнил значения характеристик узких мест в подходах 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



Большое Спасибо

564   2  

2 ответов:

Различные результаты между 1 и 2

Поскольку вы не показали свой код, я (возможно, ошибочно) предполагаю, что проблема в том, что вы, возможно, не использовали preprocess_input при объявлении ImageDataGenerator ?

from keras.applications.inception_v3 import preprocess_input

train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input) 
Однако убедитесь, что сохраненные файлы изображений находятся в диапазоне от 0 до 255. (Разрядность 24).

Различные формы между 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

    Ничего не найдено.