【问题标题】:Incompatible shapes in keraskeras 中不兼容的形状
【发布时间】:2018-10-21 19:28:45
【问题描述】:

我正在尝试将 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 张图像(我正在做立体视觉),作为输出,我得到了第一张图像的视差图。我通过将第二个图像放在第三维(np.concatenate((img1,img2),axis = -1)来连接2个图像。 有人可以告诉我我做错了什么吗? 这是我的踪迹:

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"]()]]

我尝试调整图片大小和学习作品,但由于我得到了视差图,因此调整大小不是一个好的选择。有人有什么建议吗?

【问题讨论】:

  • 请发布完整的错误/回溯,以便清楚哪个层负责错误
  • @blue-phoenox 我有问题地编辑了它。这是最后一个转置 conv2d 层
  • 我认为你应该为每张图片使用相同的输入形状,即将input_shape=(None, None, 6)更改为input_shape=(370,1240, 3)并将每张图片调整为1240x370x3
  • @user8190410 我想尽可能避免这种情况
  • 您还可以选择图像的最大尺寸作为输入形状,即最大尺寸 = 1920x1080x3 并填充尺寸小于最大尺寸的图像

标签: machine-learning keras computer-vision keras-layer


【解决方案1】:

如果图片太大而无法放入 conv2dTransponse,您可以使用Cropping2d 图层,以便将图片裁剪为所需大小。如果输入图片的像素数为偶数,则此方法有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多