Keras Conv2D CNN-检查目标时出错-预期输出较小

时间:2019-08-25 19:05:41

标签: python tensorflow machine-learning keras google-earth-engine

我正在堆叠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时,请多多指教。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

仅对此进行更新-我已经设法清除了该错误(现在是内存错误,但这是另一个问题)。

以两种方式解决了该问题。 1.在模型末尾添加了向上采样,以使数据恢复为原始大小-

下的新代码
model = Sequential()
model.add(Conv2D(32, (3, 3), padding="same", activation="relu",input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2, 2)))

model.add(Conv2D(64, (3, 3), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (3, 3), padding="same", activation="relu"))

#Upsampling
model.add(UpSampling2D(size=(2,2),interpolation='nearest'))
model.add(UpSampling2D(size=(2,2),interpolation='nearest'))

model.add(Dense(8, activation='relu'))
model.summary()

请给我下面的摘要


Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 2004, 2752, 32)    1760      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 1002, 1376, 32)    0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 1002, 1376, 64)    18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 501, 688, 64)      0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 501, 688, 128)     73856     
_________________________________________________________________
up_sampling2d_1 (UpSampling2 (None, 1002, 1376, 128)   0         
_________________________________________________________________
up_sampling2d_2 (UpSampling2 (None, 2004, 2752, 128)   0         
_________________________________________________________________
dense_1 (Dense)              (None, 2004, 2752, 8)     1032      
=================================================================
Total params: 95,144
Trainable params: 95,144
Non-trainable params: 0

第2部分-确保将x和y数据数组除以4,否则这意味着我舍入了整个模型而丢失了一些数据。下面是我的代码特有的,不是很可靠,但是可以工作

if x_train3d.shape[2] % 2:
    x_train3d_adj =  x_train3d_adj[:,:,:-1,:]
    y_train3d_adj =  y_train3d_adj[:,:,:-1,:]

还不是一个完整的解决方案,但确实使我更接近最终目标