Keras Conv2D CNN - 检查目标时出错 - 预期输出较小
Keras Conv2D CNN - Error when checking target - expected smaller output
我正在堆叠 6 层 2D 卫星图像(x 数据)并尝试 运行 CNN 对它们进行土地覆盖分类(使用 8 个土地覆盖 类 从重新格式化的 USDA 作物中获取数据层 - y 数据)。
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 的新手。
能否请您解释一下您要对什么进行分类以及您的预期是什么 y_train3D(它是图像还是某些分类值,例如 1/2/3.. 或 x/y/z。 .etc)
只是为了更新这个 - 我已经设法清除了错误(现在是内存错误,但这是另一个问题)。
通过两种方式解决了这个问题。
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,:]
还不是一个完整的解决方案,但确实让我更接近最终目标
我正在堆叠 6 层 2D 卫星图像(x 数据)并尝试 运行 CNN 对它们进行土地覆盖分类(使用 8 个土地覆盖 类 从重新格式化的 USDA 作物中获取数据层 - y 数据)。
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 的新手。
能否请您解释一下您要对什么进行分类以及您的预期是什么 y_train3D(它是图像还是某些分类值,例如 1/2/3.. 或 x/y/z。 .etc)
只是为了更新这个 - 我已经设法清除了错误(现在是内存错误,但这是另一个问题)。
通过两种方式解决了这个问题。 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,:]
还不是一个完整的解决方案,但确实让我更接近最终目标