【问题标题】:Wrong layer dimension Keras错误的层尺寸 Keras
【发布时间】: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 层之后,你需要进一步的Conv2DUpSampling2D 层,类似于你对自动编码器所做的事情
  • 我的最后一层应该是 conv2d(在 UpSampling2D 之后)吗?你能给我一个例子的链接吗?
  • 你的最后一层应该是Conv2d(2, (a, b), ...),其中2是你在y中的通道数,即(None, 160, 576, **2**)ab是过滤器大小,无论大小倒数第二层是,它被映射到160576 的高度和宽度。 (注意第一个维度,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


【解决方案1】:

尝试执行以下操作:

from keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, ZeroPadding2D, Convolution2D
from keras.models import Sequential 

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

# at this point the representation is (20, 72, 512)
# we need to evolve this to become (160, 576, 2)

#### This part I would leave out:

# 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"))

#### ... and replace it with:

model.add(Conv2D(128, (2, 2), padding="same")) # (20, 72, 128)
model.add(UpSampling2D((2,2))) # (40, 144, 128)
model.add(Conv2D(64, (2, 2), padding="same")) # (40, 144, 64)
model.add(UpSampling2D((2,2))) # (80, 288, 64)
model.add(Conv2D(16, (2, 2), padding="same")) # (80, 288, 16)
model.add(UpSampling2D((2,2))) # # (160, 576, 16)
model.add(Conv2D(2, (2, 2), activation="softmax", padding="same")) # (160, 576, 2)


print(model.summary())

【讨论】:

  • 非常感谢!!现在我明白了。ValueError:检查目标时出错:预期 conv2d_275 的形状为 (2, 576, 24),但数组的形状为 (160, 576, 2)。为什么我的形状颠倒了?
  • @KyrKalash 你试过切换 data_format='channels_last' 吗?
  • 您的输入数据似乎是“channels_first”格式。尝试将 data_format="channels_first" 参数添加到卷积层。请参阅Conv2D 上的 Keras 文档:keras.io/layers/convolutional。查找data_format 输入参数。顺便说一句,我忘了提及您设置模型的方式会导致 大量 数量的参数需要适合(超过 600 万)这样一个小模型。这主要是因为您将通道数从3 一直延伸到512。我不知道这是不是你的意图
  • 我稍微改变了模型。我收到以下错误 ValueError: Error when checks target: expected conv2d_127 to have shape (156, 572, 2) but got array with shape (160, 576, 2).如何升级我的图层?
猜你喜欢
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多