У меня большой набор данных и большие дополнения, поэтому я полагаюсь на генератор 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 массивов:
Итак, как я могу иметь переменный размер ввода с генератором керас?
Спасибовы за вашу помощь