Python 将多个ImageDataGenerator的输出合并到一个张量

Python 将多个ImageDataGenerator的输出合并到一个张量,python,tensorflow,keras,Python,Tensorflow,Keras,假设我想在两个ImageDataGenerators中对图像应用两个不同的预处理函数,然后将这些输出连接到一个张量以训练模型 i、 例如,如果我有RGB图像,我的模型预计输入张量中有六个通道,因为我想连接两个生成器的输出(每个生成器将有三个通道) 具体地说: # first preproc function def preproc_function_1(image): image = np.array(image) return image * 0.1 # second pre

假设我想在两个
ImageDataGenerator
s中对图像应用两个不同的
预处理函数
,然后将这些输出连接到一个张量以训练模型

i、 例如,如果我有RGB图像,我的模型预计输入张量中有六个通道,因为我想连接两个生成器的输出(每个生成器将有三个通道)

具体地说:

# first preproc function
def preproc_function_1(image):
    image = np.array(image)
    return image * 0.1

# second preproc function
def preproc_function_2(image):
    image = np.array(image)
    return image * 0.2

# datagen_1 - that applies preproc_function_1 
train_datagen_1 = ImageDataGenerator(
     preprocessing_function=preproc_function_1)

# datagen_2 - that applies preproc_function_2
train_datagen_2 = ImageDataGenerator(
     preprocessing_function=preproc_function_2)
如果我们有这样的并行
ImageDataGenerator
s,我想我们也要使用两个验证生成器

 validation_datagen_1 = ImageDataGenerator()

 validation_datagen_2 = ImageDataGenerator()
问题:

如何继续使用
model.fit_generator()

我想我必须使用
.flow\u from\u directory()
(我的数据可以从
flow\u from\u directory
)来提供
生成器来训练模型

是否需要从目录()创建两个
.flow\u对象?我在这里迷路了


非常感谢您提供的任何帮助

如果您只需创建一个预处理函数,就更容易了:

def preproc(image):
     return np.concatenate([
                            preproc_function_1(image), 
                            preproc_function_2(image)
                           ], axis=-1) #or axis=1 if channels_first
方案2-使用两台发电机 由于存在6通道问题,此自定义生成器应该可以工作。但您将没有“预处理”,而是有“后处理”:

class Processor(keras.utils.Sequence):
    def __init__(self, keras_generator)
        self.keras_generator = keras_generator

    def __len__(self):
        return len(self.keras_generator(

    def __getitem__(self, i):
        batch_x, batch_y = self.keras_generator[i]

        #do batch processing here

        return processed_batch_x, batch_y

    def on_epoch_end(self):
        self.keras_generator.on_epoch_end()

custom_generator = Processor(validation_datagen.flow_from_directory(...))

嗨@Daniel Möller谢谢你的回答!。我已经使用组合预处理功能创建了一个one
train\u datagen
和一个one
valid\u datagen
ImageDataGenerator
对象。但是我不知道从那时起如何使用
train\u datagen.flow\u from\u directory()
model.fit\u generator()
。调用
model.fit\u generator()
时,我遇到了以下错误:
ValueError:无法将输入数组从形状(150150,6)广播到形状(150150,3)
。我认为这是因为使用了TBC。根据文档,
flow\u from\u directory()
方法的输出是一个
DirectoryIterator,产生(x,y)元组,其中x是一个numpy数组,包含一批具有形状的图像(批大小,*目标大小,通道)
。如何将目标深度指定为6?我在目录中的图像是RGB,所以我认为这默认为3。在调试时,我可以看到错误在where
batch_x.shape
=32150150,3和
x.shape
=150150,6中返回。我知道如何从这里开始?而且,这里似乎有一个问题:这是因为您的
模型需要3个通道<代码>输入形状