Tensorflow 结合两个数据发生器来训练CNN

Tensorflow 结合两个数据发生器来训练CNN,tensorflow,keras,dataset,generator,data-augmentation,Tensorflow,Keras,Dataset,Generator,Data Augmentation,我尝试使用一个数据集来训练一个模型,我将数据集分为两部分,对于每个部分,我使用keras和tensorflow创建一个不同的ImageDataGenerator 我的问题是,如何组合来自两个生成器的数据来训练模型。我不想每个都单独使用 tnx对于所有人来说,如果没有描述它的非最小代码示例,很难准确理解您想要实现的目标。我是说,如何组合发电机?他们两个交替 无论如何,您可以使用keras创建自己的数据生成器 您可以找到自定义数据生成器的示例。您已将所有数据分为两个不同的目录;现在,您需要使用这两个

我尝试使用一个数据集来训练一个模型,我将数据集分为两部分,对于每个部分,我使用keras和tensorflow创建一个不同的ImageDataGenerator

我的问题是,如何组合来自两个生成器的数据来训练模型。我不想每个都单独使用


tnx对于所有人来说,如果没有描述它的非最小代码示例,很难准确理解您想要实现的目标。我是说,如何组合发电机?他们两个交替

无论如何,您可以使用keras创建自己的数据生成器


您可以找到自定义数据生成器的示例。

您已将所有数据分为两个不同的目录;现在,您需要使用这两个目录中的数据来训练模型

您可以通过两种方式实现这一点:

  • Keras ImageDataGenerator方法有一个
    follow\u links
    参数。您可以使用
    跟随链接
    。根据需要和所需的类结构创建一个单独的目录。在其中,从原始数据目录创建符号链接。在下图中,您可以使用
    数据
    目录作为主输入目录

    .
    ├── Directory1/
    │   ├── Class1/
    │   └── Class2/
    ├── Directory2/
    │   ├── Class1/
    │   └── Class2/
    └── Data/
        ├── Class1/
        │   ├── symlink_to_Directory1_Class1
        │   └── symlink_to_Directory2_Class1
        └── Class2/
            ├── symlink_to_Directory1_Class2
            └── symlink_to_Directory2_Class2
    
    
  • 为两个不同的目录创建了两个不同的。然后将它们合并为一个。在这种情况下,子生成器的批量大小必须根据相应目录中的数据数量按比例确定

    子发电机的批次大小:

    请参见下面的代码

    来自keras.preprocessing.image导入ImageDataGenerator
    从keras.utils导入序列
    将matplotlib.pyplot作为plt导入
    将numpy作为np导入
    导入操作系统
    类别合并发电机(顺序):
    定义初始(自身、批次大小、生成器=[],子批次大小=[]):
    self.generators=发电机
    self.sub\u batch\u size=sub\u batch\u size
    self.batch\u size=批次大小
    定义(自我):
    返回整数(
    总和([(len(self.generators[idx])*self.sub\u批量大小[idx])
    适用于范围内的idx(len(self.sub_batch_size)))/
    自组装(批量大小)
    定义uu获取项目uu(自身,索引):
    “”“从生成器获取项目并打包它们”“”
    X_批次=[]
    Y_批次=[]
    对于自动发电机中的发电机:
    如果generator.class_模式为无:
    x1=生成器[索引%len(生成器)]
    X_批次=[*X_批次,*x1]
    其他:
    x1,y1=发电机[指数%len(发电机)]
    X_批次=[*X_批次,*x1]
    Y_批次=[*Y_批次,*y1]
    如果self.generators[0],则类_模式为无:
    返回np.数组(X_批)
    返回np.array(X_批),np.array(Y_批)
    def build_数据生成器(dir1=None,dir2=None,批次大小=32):
    n_images_in_dir1=sum([len(文件)用于r,d,os.walk(dir1)中的文件)])
    n_images_in_dir2=sum([len(文件)用于r,d,os.walk(dir2)中的文件)])
    #必须为两个生成器设置不同的批量大小作为图像数
    #在这两个目录中是不一样的。因为我们必须平衡图像
    #分享发电机
    generator1_batch_size=int((n_图片_in_dir1*batch_size)/
    (n_-images_-in_-dir1+n_-images_-in_-dir2))
    generator2\u批次大小=批次大小-generator1\u批次大小
    generator1=ImageDataGenerator(
    重新缩放=1./255,
    剪切范围=0.2,
    缩放范围=0.2,
    旋转范围=5。,
    水平翻转=真,
    )
    generator2=图像数据生成器(
    重新缩放=1./255,
    缩放范围=0.2,
    水平翻转=假,
    )
    #generator2与generaor1具有不同的图像增强属性
    generator1=generator1.flow_from_目录(
    dir1,
    目标_大小=(128128),
    颜色模式='rgb',
    class_模式=无,
    批次大小=发电机1批次大小,
    洗牌=正确,
    种子=42,
    插值=“双三次”,
    )
    generator2=generator2.flow_来自_目录(
    dir2,
    目标_大小=(128128),
    颜色模式='rgb',
    class_模式=无,
    批次大小=发电机2批次大小,
    洗牌=正确,
    种子=42,
    插值=“双三次”,
    )
    返回发电机(
    批量大小,
    生成器=[generator1,generator2],
    子批次大小=[generator1批次大小,generator2批次大小])
    def测试数据发生器(批量大小=32):
    datagen=build_数据生成器(dir1=“./asdf”,
    dir2=“./asdf2”,
    批次大小=批次大小)
    打印(“数据生成器长度(批次计数):”,len(数据生成器))
    对于批次计数,枚举中的图像批次(datagen):
    如果批次计数=1:
    打破
    打印(“图像:”,图像\批处理形状)
    plt.图(figsize=(10,10))
    对于范围内的i(图像\u批处理形状[0]):
    零件子批次(1,批次尺寸,i+1)
    plt.imshow(图像\u批[i],插值='nearest')
    打印轴(“关闭”)
    plt.紧_布局()
    测试数据发生器(4)
    
  • Where,
    b = Batch Size Of Any Sub-generator
    B = Desired Batch Size Of The Merged Generator
    n = Number Of Images In That Directory Of Sub-generator
    the sum of n = Total Number Of Images In All Directories