tensorflow - 使用 flow_from_directory 在 Keras 中进行多任务输出的 ImageDataGenerator
问题描述
我正在创建一个多任务 CNN 模型,我有两个不同的分类属性(一个有 10 个类,第二个有 5 个类),我的目录结构如下所示:
-Train - image1.jpg ... - imageN.jpg -Test - image1.jpg ... - imageN.jpg -Vald - image1.jpg ... - imageN.jpg
trainlabel 是一个数据框,包含 Image、PFRType、FuelType 列
我正在尝试使用 flow_from_dataframe ,我的生成器是:
trainGen = ImageDataGenerator()
trainGenDf = trainGen.flow_from_dataframe(trainLabel,
directory = '../MTLData/train/',
x_col = "Image",y_col=["PFRType","FuelType"],
class_mode='multi_ouput',
target_size=(224,224),
batch_size=32)
我得到的错误是:检查目标时出错:预期 PFR 的形状为 (10,) 但数组的形状为 (1,)
PFR 是一个子任务层,有 10 个类输出
解决方案
您可以使用flow_from_dataframe
. 您只需将包含标签的 csv 文件解析为 pandas 数据框,该数据框将文件名映射到相应的标签。
例如,如果数据框看起来像:
| image_path | label_task_a | label_task_b | subset |
|------------|--------------|--------------|--------|
| image1.jpg | foo | bla | Train |
| ... | ... | ... | ... |
| imageN.jpg | baz | whatever | Vald |
您可以为每个子集创建一个生成器:
train_generator_task_a = datagen.flow_from_dataframe(
dataframe=df[df.subset == 'Train']],
directory='data/Train',
x_col='image_path',
y_col=['label_task_a', 'label_task_b'], # outputs for both tasks.
batch_size=32,
seed=42,
shuffle=True,
class_mode='categorical')
编辑1:
关于您的错误:如果您设置class_mode='sparse'
,Keras 期望标签是整数标签的一维 numpy 数组。您是否尝试将其设置为class_mode='multi_output'
?
推荐阅读
- python - 禁止 Django 直接分配到多对多集合的反面。使用 .set()
- laravel - 为什么我在使用 Laravel Websockets 包时遇到问题?
- c++ - 使用 nano.specs 时 libc.a 和 libc_nano.a 之间的多个函数定义
- javascript - msSaveBlob 文件损坏
- reactjs - 无法从我的 next.js 应用程序获取我的strapi 数据
- amazon-web-services - 如何减少 AWS MediaConvert 中 m3u8 的每个 .ts 块的持续时间?
- npm-install - npm WARN @loopback/eslint-config@1.1.2 需要 eslint@^5.16.0 的对等点,但没有安装。您必须自己安装对等依赖项
- azure - 使用 Azure.Identity Lib DefaultAzureCredential.GetTokenAsync 时如何强制刷新访问令牌
- javascript - NextJS/JavaScript - ReferenceError: 数组未定义 HTMLInputElement.onchange
- java - 使用 Gradle App Engine Deploy 将 Spring Boot 微服务部署到 Google App Engine 时出现 UnSupportClassVersionError