ValueError:检查目标时出错:预期conv2d_21具有4个维度,但得到的数组具有形状(26,1)

2024-06-23 19:40:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有形状为(3600, 3600, 3)的图像。我想用自动编码器。我的代码是:

from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D
from keras.models import Model
from keras import backend as K
from keras.preprocessing.image import ImageDataGenerator


input_img = Input(shape=(3600, 3600, 3))  

x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)



x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')




batch_size=2


datagen = ImageDataGenerator(rescale=1. / 255)

# dimensions of our images.
img_width, img_height = 3600, 3600

train_data_dir = 'train'
validation_data_dir = validation




generator_train = datagen.flow_from_directory(
        train_data_dir,
        target_size=(img_width, img_height),
        )



generator_valid = datagen.flow_from_directory(
        validation_data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode=None,
        shuffle=False)



autoencoder.fit_generator(generator=generator_train,
            validation_data = generator_valid,
            )

当我运行代码时,收到以下错误消息:

^{pr2}$

我知道问题出在图层的某个地方,但我找不到。有人能帮我解释一下解决办法吗?在


Tags: fromimportimgdatasizetraingeneratoractivation
1条回答
网友
1楼 · 发布于 2024-06-23 19:40:05

您的代码中存在以下问题:

  1. class_mode='input'传递给flow_from_directory方法,也将输入图像作为标签(因为您正在创建一个自动编码器)。

  2. padding='same'传递到解码器中的第三个Conv2D层:

    x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
    
  3. 在最后一层使用三个文件管理器,因为您的图像是RGB:

    decoded = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)
    

相关问题 更多 >

    热门问题