如何在 Keras (Tensorflow2) 中为多损失和多输出模型构建数据生成器/序列?

问题描述

我正在研究一个模型,其中有两个损失和两个不同的输出一个输出y 作为图像,就像 Autoencoder / U-Net 架构一样。另一个输出是简单的二元分类,取为 0/1。

所以我想说的是Siamese Based Unet。基本上基于 mae 损失重建图像并从瓶颈层创建一个分支,以便它可以根据欧氏距离预测 2 个图像是否相似。

Keras一个 ImageDataGenerator,您可以在其中使用 class_mode='input' 生成相应的图像作为 y 标签,还可以使用 class_mode=binary 生成列中给定的 0/1 值.但是我怎样才能在同一个生成器中生成这两个东西。问题是 Siamese Branch 将同时接受 2 个输入。

解决方法

您是否检查过 Sequence object .它允许创建自定义数据生成器。这个想法是子类化 Sequence 然后覆盖方法 lengetitemlen 应返回序列中的批次数。返回源和目标对的逻辑写在 getitem 中。它应该返回一批数据。如果是多输入模型,您可以编写 getitem 使其输出数据包括映射到模型输入层的字典(key=layername)。对于输出张量也是如此。更多信息可以在我在上面添加的官方文档的链接中找到。最好的

编辑

根据我对您的问题的理解,这是要点。:

class Dataset(Sequence):
    def __init__(self,filenames,batchsize,shape):
        self.filenames = filenames # List of filenames
        self.batchsize = batchsize
        self.shape = shape # Shape to which image should be 
        # resized

    def __len__(self):
        return len(self.filenames) // batchsize

    def __getitem__(self,idx):
        i = idx * self.batchsize
        
        X_1 = np.zeros((self.batchsize,self.shape[0],self.shape[1],3)
        y = np.zeros((self.batchsize,--,...,--)) # Depends on
        # your target choice

        filenames = self.filenames[i:i+self.batchsize]

        for index,filename in enumerate(filenames):
            image = cv2.imread(filename)
            
            # Preprocess
            image = your_preprocess(image)

            X[index] = image

         
         # You can include your pipeline for other
         # Input also.

         # Similarly obtain target values and load to y.

         
         return {"layername": X_1,"layername": X_2},{"layername": y}