Керас: Как использовать генератор с переменным входным размером - PullRequest
0 голосов
/ 26 мая 2019

У меня большой набор данных и большие дополнения, поэтому я полагаюсь на генератор keras.utils.Sequence и позволяю Keras выполнять многопроцессорную обработку.Поэтому использование простой команды model.fit(...) не подходит для меня, когда речь идет о переменном размере ввода.Кроме того, из-за моей специфической проблемы не очень хорошая идея изменять размер или дополнять изображения.

Кроме того, выбор размера партии 1 не очень удобен из-за слоев BatchNormalization.

У меня переменные размеры изображений, и я создал игрушечный пример моей проблемы:

from keras.applications.vgg16 import VGG16 as model
from keras.utils import Sequence
import numpy as np
from keras.layers import Input, Flatten, Dense, GlobalAveragePooling2D
from keras.models import Model

CLASSES = 10
class ExampleGenerator(Sequence):

    def __init__(self,dataset_length=100,batch_size=8):
        self.dataset_length = dataset_length
        self.batch_size = batch_size

    def __len__(self):
        return int(np.ceil(self.dataset_length / float(self.batch_size)))

    def __getitem__(self,idx):

        # create random targets
        Y_batch = np.random.randint(0,2,size=(self.batch_size,CLASSES))
        X = []

        for i in range(self.batch_size):


            # create a random image with a random size

            width = np.random.randint(64,256)
            height = np.random.randint(64,256)
            img = np.random.rand(width,height,3)
            X.append(img)

        X_batch = np.array(X)
        return X_batch,Y_batch


gen = ExampleGenerator()
input_tensor = Input(shape=(None, None, 3))

base_model = model(input_tensor=input_tensor,weights=None, include_top=False)

output = base_model.output

x = GlobalAveragePooling2D()(output)
x = Dense(512)(x)
predictions = Dense(CLASSES)(x)


model = Model(inputs=base_model.input, outputs=predictions)

model.compile(optimizer='adam', loss='categorical_crossentropy')

model.fit_generator(gen)

Обратите внимание, что этот пример предназначен только для воссоздания моей проблемы.

При выполнении сценария будет выдано следующее сообщение об ошибке:

ValueError: Ошибка при проверке ввода: ожидалось, что input_2 имеет 4 измерения, но получен массив с формой (8,1)

, что, конечно, связано с тем, что __getitem__ возвращает numpy arry с фиксированным размером только batch_size.

Когда список X не преобразован ввозникает другая ошибка массива numpy:

ValueError: Ошибка при проверке ввода модели: список массивов Numpy, передаваемых в вашу модель, не соответствует размеру, ожидаемому моделью.Ожидается увидеть 1 массив (ов), но вместо этого получен следующий список из 8 массивов:

Итак, как я могу иметь переменный размер ввода с генератором керас?

Спасибовы за вашу помощь

1 Ответ

3 голосов
/ 26 мая 2019

Нельзя использовать batch_size больше 1 для изображений переменного размера.Если вы используете изображения с переменным размером и хотите отправить пакет размером больше единицы, вам следует исправить размеры для входных данных модели и добавить некоторые отступы, чтобы достичь этого фиксированного размера в вашем генераторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...