Несовместимые формы в керасе - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь использовать сетевую архитектуру U-net для стереозрения. У меня есть наборы данных с 3 различными размерами изображения (1240x368, 1224x368 и 1384x1104).

Вот мой целый класс:

import pickle
from keras.models import Sequential  
from keras.layers import Convolution2D, MaxPooling2D, UpSampling2D, Conv2DTranspose
from keras.utils import np_utils
import sys, numpy as np
import keras
import cv2

pkl_file = open('data.p', 'rb')
dict = pickle.load(pkl_file)

X_data = dict['images']
Y_data = dict['disparity']

data_num = len(X_data)
train_num = int(data_num * 0.8)

X_train = X_data[:train_num]
X_test = X_data[train_num:]

Y_train = Y_data[:train_num]
Y_test = Y_data[train_num:]

def gen(X, Y):
    while True:
        for x, y in zip(X, Y):
            yield x, y


model = Sequential()
model.add(Convolution2D(6, (2, 2), input_shape=(None, None, 6), activation='relu', padding='same'))
model.add(Convolution2D(64, (3, 3), activation='relu'))
model.add(Convolution2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(64, (3, 3), activation='relu'))
model.add(Convolution2D(128, (3, 3), activation='relu'))
model.add(Convolution2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(128, (3, 3), activation='relu'))
model.add(Convolution2D(256, (3, 3), activation='relu'))
model.add(Convolution2D(256, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(UpSampling2D(size=(2, 2)))

model.add(Conv2DTranspose(256, (3, 3), activation='relu'))
model.add(Conv2DTranspose(256, (3, 3), activation='relu'))
model.add(Conv2DTranspose(128, (3, 3), activation='relu'))
model.add(UpSampling2D(size=(2, 2)))

model.add(Conv2DTranspose(128, (3, 3), activation='relu'))
model.add(Conv2DTranspose(128, (3, 3), activation='relu'))
model.add(Conv2DTranspose(64, (3, 3), activation='relu'))
model.add(UpSampling2D(size=(2, 2)))

model.add(Conv2DTranspose(64, (3, 3), activation='relu'))
model.add(Conv2DTranspose(64, (3, 3), activation='relu'))
model.add(Conv2DTranspose(3, (3, 3), activation='relu'))
model.compile(loss=['mse'], optimizer='adam', metrics=['accuracy'])

model.fit_generator(gen(X_train, Y_train), steps_per_epoch=len(X_train), epochs=5)
scores = model.evaluate(X_test, Y_test, verbose=0)

Когда я пытаюсь запустить этот код, я получаю сообщение об ошибке:

Несовместимые формы: [1,370,1242,3] против [1,368,1240,3] Я изменил размер изображения, чтобы его можно было разделить на 8, так как у меня есть 3 слоя maxpool. В качестве входных данных я помещаю 2 изображения (я делаю стереозрение), а в качестве выходных данных я получаю карту диспаратности для первого изображения. Я объединяю 2 изображения, помещая второе в третье измерение (np.concatenate ((img1, img2), axis = -1). Может кто-нибудь сказать мне, что я делаю не так? Вот мой след:

Traceback (последний вызов был последним):

File "C:\Users\Ivan\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\client\session.py", line 1322, in _do_call
    return fn(*args)
File "C:\Users\Ivan\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\client\session.py", line 1307, in _run_fn
    options, feed_dict, fetch_list, target_list, run_metadata)
File "C:\Users\Ivan\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\client\session.py", line 1409, in _call_tf_sessionrun
    run_metadata)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [1,370,1242,3] vs. [1,368,1240,3]
[[Node: loss/conv2d_transpose_9_loss/sub = Sub[T=DT_FLOAT, _class=["loc:@training/Adam/gradients/loss/conv2d_transpose_9_loss/sub_grad/Reshape"], _device="/job:localhost/replica:0/task:0/device:GPU:0"](conv2d_transpose_9/Relu-1-0-TransposeNCHWToNHWC-LayoutOptimizer, _arg_conv2d_transpose_9_target_0_2/_303)]]
[[Node: loss/mul/_521 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_2266_loss/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

Я попытался изменить размеры изображений и обучающих работ, но, поскольку в результате я получаю карты несоответствия, изменение размера не является хорошим вариантом. У кого-нибудь есть совет?

1 Ответ

0 голосов
/ 18 мая 2018

Если изображение слишком велико для размещения в conv2dTransponse, вы можете использовать слой Cropping2d , чтобы обрезать изображение до желаемого размера. Это работает, если входное изображение имеет четное количество пикселей.

...