比方说,我有一些分为3类(“猫”,“狗”,“鼠标”)的图片,我的DL网络是用keras编写的。 我使用的设计与此图片相同(1):
我将数据分为三个不同的文件夹:培训,验证和测试。 网在给定图片的情况下应该能够识别猫,狗或鼠标。我得到的准确度约为98%。
有效。 但是出于某些原因,我需要更改该设计。我想使用K折交叉验证过程,现在该架构应类似于(2):
现在我的问题是我不知道如何根据图2中的模式拆分和分发原始数据。
我只能想象2种不同的方式。让我们暂时忘记测试目录:
我创建2个文件夹:“培训”和“验证”。两者的结构都与图1相同:每个类别都有三个子目录。现在的问题是:从 Fold 1 升级到 Fold 3 时,是否应该移动数据?或者我可以将图像分配到子目录中?
我创建2个文件夹:“ Training”和“ Validation”,但我将所有图像混合在一起。没有子目录。在这种情况下,我的问题是我失去了图片名称和上面的宠物之间的联系。我该如何告诉Keras,应该识别哪只动物?
我个人将所有图像混合在一起,无论它们显示什么。但是我会将内容的信息保存到文件中。在这种情况下,我将目录(验证或培训)和一个包含所有文件名称及其内容的文件传递给Keras。
您有什么建议?
答案 0 :(得分:0)
好的,我可以回答我自己的问题。
最简单的方法就是在python脚本中以用户Kfold
的形式sklearn
from sklearn.model_selection import KFold
在那之后,您需要使KFold保持正常状态
kfold = KFold(n_splits = 4, shuffle = True)
,然后遍历拆分后的数据集,如:
datagen = ImageDataGenerator(rescale = 1. / 255.)
for train, test in kfold.split(df_data):
# df is the whole dataset (all together!)
df_train = df.iloc[train, :] # Look that train is coming from the for in .. loop
df_test = df.iloc[test, :] # The same for test
train_generator = datagen.flow_from_dataframe(dataframe = df_train,
directory = dataset_dir,
... )
test_generator = datagen.flow_from_dataframe(dataframe = df_test,
directory = dataset_dir,
...)
model = models.Sequential()
.....
model.compile(...)
model.fit(...)
就完成了!现在,数据集已划分为多个分区!!!
注意,该类ImageDataGenerator不在for循环中!!!
并且请注意,请注意,方法(模型creation, compile() and fit()
)必须 在for循环中。
上面的代码对我来说很好。