Keras 检查目标时出错:预期conv2d_29有4个维度,但得到了具有形状的数组(1255,12)

Keras 检查目标时出错:预期conv2d_29有4个维度,但得到了具有形状的数组(1255,12),keras,deep-learning,keras-layer,Keras,Deep Learning,Keras Layer,我想训练一个深度学习模型,其中输入图像形状为(224,3)。我想把它们输入一个u-net模型 训练后,我得到错误:检查目标时出错:预期conv2d_29有4个维度,但得到了具有形状的数组(1255,12) 我很困惑,因为我确信图像数组和标签没有问题。问题是否在模型中?我应该如何解决这个问题 模型如下: #def unet(pretrained_weights = None, input_size = (224,224,3)): concat_axis = 3 input_size= Input(

我想训练一个深度学习模型,其中输入图像形状为(224,3)。我想把它们输入一个u-net模型

训练后,我得到错误:检查目标时出错:预期conv2d_29有4个维度,但得到了具有形状的数组(1255,12)

我很困惑,因为我确信图像数组和标签没有问题。问题是否在模型中?我应该如何解决这个问题

模型如下:

#def unet(pretrained_weights = None, input_size = (224,224,3)):
concat_axis = 3
input_size= Input((224,224,3))
conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(input_size)
conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
#flat1 = Flatten()(pool1)
conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1)
conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool2)
conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv3)
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)
conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool3)
conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv4)
drop4 = Dropout(0.5)(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(drop4)

conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool4)
conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv5)
drop5 = Dropout(0.5)(conv5)

up_conv5 = UpSampling2D(size=(2, 2),  data_format="channels_last")(conv5)
ch, cw = get_crop_shape(conv4, up_conv5)
crop_conv4 = Cropping2D(cropping=(ch,cw),  data_format="channels_last")(conv4)
up6   = concatenate([up_conv5, crop_conv4], axis=concat_axis)
conv6 = Conv2D(256, (3, 3), padding="same", activation="relu", kernel_initializer = 'he_normal')(up6)
conv6 = Conv2D(256, (3, 3), padding="same", activation="relu", kernel_initializer = 'he_normal')(conv6)

up_conv6 = UpSampling2D(size=(2, 2), data_format="channels_last")(conv6)
ch, cw = get_crop_shape(conv3, up_conv6)
crop_conv3 = Cropping2D(cropping=(ch,cw), data_format="channels_last")(conv3)
up7   = concatenate([up_conv6, crop_conv3], axis=concat_axis)
conv7 = Conv2D(128, (3, 3), padding="same", activation="relu", kernel_initializer = 'he_normal')(up7)
conv7 = Conv2D(128, (3, 3), padding="same", activation="relu", kernel_initializer = 'he_normal')(conv7)

up_conv7 = UpSampling2D(size=(2, 2), data_format="channels_last")(conv7)
ch, cw = get_crop_shape(conv2, up_conv7)
crop_conv2 = Cropping2D(cropping=(ch,cw), data_format="channels_last")(conv2)
up8   = concatenate([up_conv7, crop_conv2], axis=concat_axis)
conv8 = Conv2D(64, (3, 3), padding="same", activation="relu", kernel_initializer = 'he_normal')(up8)
conv8 = Conv2D(64, (3, 3), padding="same", activation="relu", kernel_initializer = 'he_normal')(conv8)

up_conv8 = UpSampling2D(size=(2, 2), data_format="channels_last")(conv8)
ch, cw = get_crop_shape(conv1, up_conv8)
crop_conv1 = Cropping2D(cropping=(ch,cw), data_format="channels_last")(conv1)
up9   = concatenate([up_conv8, crop_conv1], axis=concat_axis)
conv9 = Conv2D(32, (3, 3), padding="same", activation="relu", kernel_initializer = 'he_normal')(up9)
conv9 = Conv2D(32, (3, 3), padding="same", activation="relu", kernel_initializer = 'he_normal')(conv9)

model = Model(inputs = input_size, outputs = conv9)

由于模型输出的层是conv layer,因此输出形状有4个维度(批次大小、宽度、高度、通道)。但是您正在输入一个形状数组(1255,12)。如果目标标签的形状为(Batch_size,num_features),则最后一层的输出的形状应为(None,12)或(Batch_size,12)。 处理这种情况有两种选择

  • 在conv层输出平坦后使用密集层
  • 重塑conv层的输出,使其具有所需的形状
  • 选择取决于你正在处理的问题。如果问题是分类,可使用选项1添加softmax激活。对于选项1,对代码的修改将是

    conv9=Conv2D(32,(3,3),padding=“same”,activation=“relu”,kernel\u初始值设定项='he\u normal')(conv9)
    展平1=展平()(conv9)
    dense1=密集(12,activation=“softmax”)(flatt1)#激活的选择取决于您处理的问题。
    模型=模型(输入=输入大小,输出=密度1)
    
    对于选项2,修改将是

    conv9=Conv2D(32,(3,3),padding=“same”,activation=“relu”,kernel\u初始值设定项='he\u normal')(conv9)
    重塑1=重塑((12,)(conv9)#激活的选择取决于您处理的问题。
    模型=模型(输入=输入大小,输出=1)
    
    注意:当使用
    重塑
    层将张量重塑为(无,12)形状时,确保前一层输出形状的乘积应可被12整除