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