首页 > 解决方案 > Keras Conv2D CNN - 检查目标时出错 - 预期输出较小

问题描述

我正在堆叠 6 层 2D 卫星图像(x 数据)并尝试在它们上运行 CNN 以对土地覆盖物进行分类(使用从重新格式化的 USDA 作物数据层 - y 数据中提取的 8 个土地覆盖物类别)。

x 数据的形状为 (2004, 2753, 6),y 的形状最初为 (2004, 2753, 8),我使用 data_x.reshape(-1,2004,2752,6) (y 相同)添加一个作为模型的额外维度。

y 数据集中的 8 个类别以 8 个波段的数字格式表示 8 个可能的土地覆盖类别(即第一个波段是玉米,用 1 表示正数,0 表示非玉米)。

但是,当我尝试运行模型时,预期的形状与传递给它的形状不匹配。我不确定我是否使用了正确的模型结构或数据结构 - 一种想法是采用 y 数据集的 8 个波段

基于一些严肃的谷歌搜索,我一直在学习如何将数据转换为具有正确数量的维度等的正确格式,但我觉得我在维度方面遇到了最后一个障碍(并且很可能是正确准备 x 和 y 数据套)。

下面是CNN模型

input_shape=([2004, 2753, 6])

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),strides=(1, 1),activation='relu',input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2, 2), padding="same"))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2), padding="same"))
model.add(Dropout(0.25))
#model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(8, activation='softmax'))
#model.add(Flatten())
model.summary()

模型摘要 - 预计最后有 500、687、8

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_54 (Conv2D)           (None, 2002, 2751, 32)    1760      
_________________________________________________________________
max_pooling2d_52 (MaxPooling (None, 1001, 1376, 32)    0         
_________________________________________________________________
conv2d_55 (Conv2D)           (None, 999, 1374, 32)     9248      
_________________________________________________________________
max_pooling2d_53 (MaxPooling (None, 500, 687, 32)      0         
_________________________________________________________________
dropout_57 (Dropout)         (None, 500, 687, 32)      0         
_________________________________________________________________
dense_59 (Dense)             (None, 500, 687, 128)     4224      
_________________________________________________________________
dropout_58 (Dropout)         (None, 500, 687, 128)     0         
_________________________________________________________________
dense_60 (Dense)             (None, 500, 687, 8)       1032      
=================================================================
Total params: 16,264
Trainable params: 16,264
Non-trainable params: 0
_________________________________________________________________

编译

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

model.compile(loss='categorical_crossentropy',
            optimizer='sgd',
            metrics=['accuracy'])

适合 - 我在哪里收到错误消息

history = model.fit(x_train3d, y_train3d,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_split=0.2, validation_data=None)

x_train3D 的形状 = (1, 2004, 2753, 6) y_train3D 的形状 = (1, 2004, 2753, 8)

错误信息

ValueError: Error when checking target: expected dense_58 to have shape (500, 687, 8) but got array with shape (2004, 2753, 8)

同样,我怀疑这归结为需要为输入和输出获取正确格式的数据,但也可能在模型规范中出现问题。由于我是 Keras 的新手,因此希望得到一些指导。

标签: pythontensorflowmachine-learningkerasgoogle-earth-engine

解决方案


您能否解释一下您要分类什么以及您期望的 y_train3D 是什么(它是图像还是分类值,例如 1/2/3.. 或 x/y/z..等)


推荐阅读