我正在堆叠6层2D卫星图像(x数据),并试图在其上运行CNN来分类土地覆盖(使用从美国农业部作物数据层-y数据重新格式化中提取的8个土地覆盖类别)。你知道吗
x数据的形状(2004,2753,6)和y的形状(2004,2753,8)最初,我使用了数据_x.reformate(-120042752,6)(y相同)添加了一个额外的尺寸作为模型。你知道吗
y数据集中的8个类别以8个波段的数字格式表示8个可能的土地覆盖类别(即,第一个波段是玉米,用1表示正,0表示非玉米)。你知道吗
但是,当我尝试运行模型时,预期的形状与传递给它的形状不匹配。我不确定我是否使用了正确的模型结构或数据结构-一个想法是采用y数据集的8个波段
基于一些认真的google搜索,我一直在学习如何将数据转换成正确的格式、正确的维度数等,但我觉得我在维度方面遇到了最后一个障碍(很可能是正确准备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'])
fit-我从哪里得到错误信息
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)
同样,我怀疑这是因为需要为输入和输出以正确的格式获取数据,但也可能是模型规范中的某些错误。如果你能给我一些指导的话,我会很感激的。你知道吗
只是更新一下-我已经设法清除了错误(现在是内存错误,但那是另一个问题)。你知道吗
从两个方面解决了这个问题。 1在模型末尾添加了上采样,以将数据恢复到原始大小-下面是新代码
给我下面的摘要
第2部分-确保x和y数据数组可除以4,否则这意味着通过舍入,我将丢失模型中的一些数据。下面的代码是针对我的代码的,不是健壮的,而是有效的
还不是一个完整的解决方案,但确实让我离最终目标更近了
你能解释一下你想要分类的是什么?你期望的是什么样的培训3D(它是一个图像还是一些分类值,例如1/2/3。。或x/y/z…等)
相关问题 更多 >
编程相关推荐