【发布时间】:2019-05-25 15:53:36
【问题描述】:
我正在使用 KITTI 数据集构建道路分割模型。当我尝试训练我的模型时,出现以下错误
Error when checking target: expected activation_26 to have 2 dimensions,
but got array with shape (289, 160, 576, 2)
我的 x 的形状为 (289, 160, 576, 3) 和 y (289, 160, 576, 2)。我的模型是这样的
我的模特。
model = Sequential()
model.add(Conv2D(96, (5, 5), padding="same",input_shape=(160, 576, 3)))
model.add(Convolution2D(64, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(64, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2), dim_ordering="tf"))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(128, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(128, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2), dim_ordering="tf"))
model.add(ZeroPadding2D((1,1)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2) , dim_ordering="tf"))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
# softmax classifier
model.add(Dense(2))
model.add(Activation("softmax"))
#Here is my data augmentation
aug = ImageDataGenerator(rotation_range=40, width_shift_range=0.2,
height_shift_range=0.2, shear_range=0.1, zoom_range=0.2,
fill_mode="nearest")
adam = Adam(lr=1e-5)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
H = model.fit_generator(aug.flow(x, y, batch_size=BATCH_SIZE),
validation_data=(x, y), steps_per_epoch=len(x) // BATCH_SIZE,
epochs=EPOCHS, verbose=1)
我猜这是最后一层的问题。我的 y 是多维的,但我的最后一层是二维的。当我将图层更改为 model.add(Dense((289, 160, 576, 2))) 时,我收到此错误 TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
【问题讨论】:
-
如果你的 y 数据是多维格式,为什么还要使用
Flatten()?在我看来,在你最后的MaxPooling层之后,你需要进一步的Conv2D和UpSampling2D层,类似于你对自动编码器所做的事情 -
我的最后一层应该是 conv2d(在 UpSampling2D 之后)吗?你能给我一个例子的链接吗?
-
你的最后一层应该是
Conv2d(2, (a, b), ...),其中2是你在y中的通道数,即(None, 160, 576, **2**)和a和b是过滤器大小,无论大小倒数第二层是,它被映射到160和576的高度和宽度。 (注意第一个维度,289是观察的数量;它被替换为占位符None,其实际大小将根据您选择的批量大小而有所不同) -
谢谢,但我如何实现 UpSampling2D 层?
-
我试过 model.add(Convolution2D(5,( 160, 576), activation='relu'))。我得到了一个结果ValueError:负尺寸大小是由'conv2d_254 / convolution'(op:'Conv2D')的147减去160引起的,输入形状为:[?,512,147,5],[160,576,512,5]。为什么应该是 5 而不是 2?
标签: python keras neural-network deep-learning classification