Пользовательская модель Datagenerator keras ожидает 2 массива, но получает 1 - PullRequest
0 голосов
/ 06 ноября 2019

Итак, я пытаюсь заставить этот генератор работать нормально, но, похоже, у него проблемы с ним. Кажется, что генератор работает нормально, как я пытался использовать gen. next (), и он производит то, что я хочу. Однако, возможно, он не будет в том же виде, в каком я думаю.

# Image processing
def preprocess_image(image_path):
    img = image.load_img(image_path, target_size=(224, 224))
    img = image.img_to_array(img)
    img = preprocess_input(img)
    return img


def image_generator(data, batch_size):
    datagen_args = dict(horizontal_flip=True)
    datagen = ImageDataGenerator(**datagen_args)

    while True:
        for i in range(0, len(data) // batch_size):
            # get the label and the imagepath
            imgpath, label = data[i]
            # Process the image
            img = preprocess_image(imgpath)
            img = datagen.random_transform(img)
            #img = np.expand_dims(img, axis=0)
            # add a 0 for a dummy variable
            dummy_label = np.zeros(len(label))
            x_data = np.array([img, label])
            yield x_data, dummy_label


# Prepare data need a array [image, label]
X = []  # hold the data before processing
Y = []
IMAGE_DIR = 'dataset/gt_bbox'

for file in os.listdir(IMAGE_DIR):
    file_path = os.path.join(IMAGE_DIR, file)
    label = int(file.split('_')[0])
    X.append(file_path)
    Y.append(label)
# Convert to catigorical
Y = to_categorical(Y)

image_dataset = []
for i in range(0,len(X)):
    image_dataset.append([X[i], Y[i]])
# Split to train test data
train, val = train_test_split(image_dataset)

BATCHSIZE = 32

imggen = image_generator(train, BATCHSIZE)
valgen = image_generator(val, BATCHSIZE)

model.fit_generator(imggen,
                steps_per_epoch=1000,
                epochs=10,
                validation_data=valgen,
                validation_steps=300,
                verbose=1)

Моя модель настроена так

input_images = Input(shape=(224, 224, 3), name='input_image')  # input layer     for images
input_labels = Input(shape=(1,), name='input_label')  # input layer for labels
embeddings = base_network([input_images])  # output of network -> embeddings
labels_plus_embeddings = Concatenate(axis=-1)([input_labels, embeddings])  # concatenating the labels + embeddings

model = Model(inputs=[input_images, input_labels], outputs=labels_plus_embeddings)

Я могу ошибаться в том, как я строю модель, но мне это кажется правильным. Любая помощь будет оценена.

Сообщение об ошибке

ValueError: Ошибка при проверке ввода модели: список массивов Numpy, передаваемых в вашу модель, не соответствует размеру, ожидаемому моделью. Ожидается увидеть 2 массива (ов), но вместо этого получен следующий список из 1 массива: [array ([[array ([[[- 0.56078434, -0.52156866, -0.4980392], [-0.56078434, -0.52156866, -0.4980392],[-0,56078434, -0,52156866, -0,4980392], ..., [-0,5764706, -0,545098 ...

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