Keras 2d дополнение и ввод - PullRequest
       3

Keras 2d дополнение и ввод

0 голосов
/ 25 апреля 2018

Я пытаюсь скормить 2D CNN изображениями разных размеров. С этой целью (и так как я не хочу изменять свои изображения), я пытаюсь выполнить 2D-заполнение.

Проблема заключается в следующем: изображения, которые должны подаваться в сеть, читаются и преобразуются в 3-х мерные помехи (с формами вида: (80, 35, 3). Поскольку изображения не имеют одинаковую форму Я не могу создать массив np.array, чтобы поместить их в него - поэтому я добавляю их в список. Таким образом, известная ошибка:

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

Итак, вопрос: как я могу подать эти изображения в слой заполнения?

Я пробовал много вещей, таких как вызов Input в начале:

    inputs = Input(shape = (None, None, 3,))

или настройку моего слоя заполнения следующим образом:

    model.add(ZeroPadding2D(padding=(64, 64), batch_input_shape= (1000, None, None, 3)))

но я не могу понять это правильно.

Будет ли у кого-нибудь решение?

Заранее спасибо,

M

1 Ответ

0 голосов
/ 25 апреля 2018

Заполнение

Если вы хотите заполнить (что замедлит вашу модель, выполнив слишком много ненужных операций), вы должны сделать это за пределами модели, с пустышкой.

Если выиметь список изображений, например список пустых массивов, каждый из которых имеет форму (side1,side2,3):

desiredX = someValue
desiredY = someValue
padded_images = []

for img in list_of_images:
    shape = img.shape
    xDiff = desiredX - shape[0]
    xLeft = xDiff//2
    xRight = xDiff-xLeft

    yDiff = desiredY - shape[1]
    yLeft = yDiff//2
    yRight = yDiff - yLeft

    padded_images.append(np.pad(img,((xLeft,xRight),(yLeft,yRight),(0,0)), mode='constant')
         #or choose another mode

padded_images = np.asarray(padded_images) #this can go into the model

Отдельное обучение

В качестве альтернативы вы можете обучать партии одного изображения или группировать небольшие партииизображения с одинаковым размером.(Я не знаю, какой из них будет более эффективным, но если у вас слишком большие различия в размерах, это может быть лучше)

for epoch in range(epochs):
    for img,output in zip(list_of_images,list_of_outputs):
        img = np.expand_dims(img,axis=0) #add the batch size = 1
        output = np.expand_dims(output,axis=0) ##add batch size = 1
        model.train_on_batch(img,output,....)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...