需要对自动编码器上的 fit_generator 工作进行哪些更改

sko*_*apa 4 python autoencoder keras

我目前正在使用在卷积网络上运行良好的生成器。但是,当我使用相同的生成器来拟合自动编码器时,会出现以下错误。

**Exception: output of generator should be a tuple (x, y, sample_weight) or (x, y). Found: [[[[ 0.86666673  0.86666673  0.86666673 ...,  0.62352943  0.627451
     0.63137257]
   [ 0.86666673  0.86666673  0.86666673 ...,  0.63137257  0.627451
     0.627451  ]
   [ 0.86666673  0.86666673  0.86666673 ...,  0.63137257  0.627451
     0.62352943]
   ...,**
Run Code Online (Sandbox Code Playgroud)

我的代码如下

from keras.layers import Input, Dense, Convolution2D, MaxPooling2D,       
from keras.models import Model,Sequential
from keras.preprocessing.image import ImageDataGenerator 
import numpy as np
import os
import h5py


img_width=140 
img_height=140
train_data_dir=r'SitePhotos\train'
valid_data_dir=r'SitePhotos\validation'
input_img = Input(batch_shape=(32,3, img_width, img_width))

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

# at this point the representation is (8, 4, 4) i.e. 128-dimensional

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

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



valid_datagen = ImageDataGenerator(rescale=1./255)
train_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        train_data_dir,
        target_size=(img_width, img_height),
        batch_size=32,
        class_mode=None,
        shuffle=True)


valid_generator = valid_datagen.flow_from_directory(
        valid_data_dir,
        target_size=(img_width, img_height),
        batch_size=32,
        class_mode=None,
        shuffle=True)

autoencoder.fit_generator(train_generator,
                nb_epoch=50,                
                validation_data=valid_generator,
                samples_per_epoch=113,
                nb_val_samples=32
                )
Run Code Online (Sandbox Code Playgroud)

我对生成器所做的唯一更改是将类模式设置为无。将类模式保持为“二进制”也无济于事。由于拟合生成器需要一个元组,我尝试将 (train_generator, train_generator) 和 (valid_generator,valid_generator) 作为参数传递给 fit_generator。

在这种情况下得到以下异常

检查模型输入时出错:数据应该是 Numpy 数组,或 Numpy 数组的列表/字典。成立:

但似乎没有任何效果。不知道我错过了什么。作为 keras 新手,任何帮助将不胜感激。

谢谢SK

BAK*_*YAC 5

将您的 class_mode 更改为:

 class_mode = input
Run Code Online (Sandbox Code Playgroud)

input:与输入图像相同的图像(主要用于与自动编码器一起使用)。