我有一个类似于下面的模型,但在修改架构后,我不断收到以下错误:
通过从< conv2d_5 / convolution'中删除5而导致的负尺寸大小(op:' Conv2D')输入形状:[?,4,80,64],[5,5,64,64]。
我还是机器学习的新手,所以我无法理解参数。有什么帮助吗?
model_img = Sequential(name="img")
# Cropping
model_img.add(Cropping2D(cropping=((124,126),(0,0)), input_shape=(376,1344,3)))
# Normalization
model_img.add(Lambda(lambda x: (2*x / 255.0) - 1.0))
model_img.add(Conv2D(16, (7, 7), activation="relu", strides=(2, 2)))
model_img.add(Conv2D(32, (7, 7), activation="relu", strides=(2, 2)))
model_img.add(Conv2D(32, (5, 5), activation="relu", strides=(2, 2)))
model_img.add(Conv2D(64, (5, 5), activation="relu", strides=(2, 2)))
model_img.add(Conv2D(64, (5, 5), activation="relu", strides=(2, 2)))
model_img.add(Conv2D(128, (3, 3), activation="relu"))
model_img.add(Conv2D(128, (3, 3), activation="relu"))
model_img.add(Flatten())
model_img.add(Dense(100))
model_img.add(Dense(50))
model_img.add(Dense(10))
model_lidar = Sequential(name="lidar")
model_lidar.add(Dense(32, input_shape=(360,)))
model_lidar.add(Dropout(0.1))
model_lidar.add(Dense(10))
model_imu = Sequential(name='imu')
model_imu.add(Dense(32, input_shape=(10, )))
model_imu.add(Dropout(0.1))
model_imu.add(Dense(10))
merged = Merge([model_img, model_lidar, model_imu], mode="concat")
model = Sequential()
model.add(merged)
model.add(Dense(16))
model.add(Dropout(0.2))
model.add(Dense(1))
答:由于传感器问题,我无法完成培训,但由于下面的2个答案,模型现在正常工作
答案 0 :(得分:4)
以下是模型中每个图层的输出形状
(?, 376, 1344, 3) - Input
(?, 126, 1344, 3) - Cropping2D
(?, 126, 1344, 3) - Lambda
(?, 60, 669, 16) - Conv2D 1
(?, 27, 332, 32) - Conv2D 2
(?, 12, 164, 32) - Conv2D 3
(?, 4, 80, 64) - Conv2D 4
当输入通过第4个Conv2D图层时,输出形状已经为(4,80)
。由于输出的第一个维度小于过滤器大小,因此无法应用具有过滤器大小(5,5)的其他Conv2D图层。
答案 1 :(得分:2)
您的卷积层可以非常快速地缩小图像大小。因此,一旦它的尺寸仅为4,就不能再应用5x5卷积。
如果没有填充,卷积层的输出尺寸为(input_dimension - kernel_size)/strides
。多次抽取7(或5)并不重要,但将尺寸缩小两倍会使尺寸变得非常快。
解决方案要么不使用步幅(在第一层之后)。添加填充有助于防止由于内核而导致的大小减小,但不是由于步幅。