如何将Azure Blob存储的图像加载到Keras ImageDataGenerator中
解决方法
你现有代码存在两处核心错误,修正后即可正常调用flow_from_directory读取数据集:
1. 先修正流水线代码的问题
- 你重复定义了
PythonScriptStep的inputs参数,会导致后一个定义覆盖前一个,raw_data输入直接失效 - 你构造
FileDataset时用了单文件通配符*.jpg,会丢失原有的Train/classX目录层级结构,而flow_from_directory强依赖按类别分目录的结构,需要调整DataPath的匹配范围
修正后的流水线代码:
# 直接匹配整个ds目录,完整保留原有层级结构 datastore_path = DataPath(datastore, "ds/") ds = Dataset.File.from_files(path=datastore_path) pipeline_train = PythonScriptStep( name='02 Train Model', source_directory=".", script_name='train.py', # 合并inputs参数,禁止分开写两次 inputs=[ds.as_named_input('raw_data').as_download(), dataFolder], outputs=[datafolder], arguments=['--datafolder', datafolder], runconfig=self.run_config ) steps = [pipeline_train] pipeline = Pipeline(workspace=self.ws, steps=steps)
2. 修正train.py的路径获取逻辑
as_download()模式下的FileDataset会自动下载到计算节点的本地路径,不需要通过输出参数args.datafolder拼接,直接读取输入数据集的本地路径即可:
# 获取流水线作业传入的参数 import argparse from azureml.core import Run from tensorflow.keras.preprocessing.image import ImageDataGenerator parser = argparse.ArgumentParser() parser.add_argument('--datafolder', type=str) args = parser.parse_args() run_ = Run.get_context() # 直接获取下载后的数据集本地根目录 raw_data_dir = run_.input_datasets['raw_data'] b_size = 10 size = 100 train_gen = ImageDataGenerator() # 拼接训练集路径,下载的目录结构和datastore中完全一致 train_path = f"{raw_data_dir}/Train" train_images = train_gen.flow_from_directory( train_path, target_size=(size,size), color_mode="rgb", batch_size=b_size, shuffle=True, class_mode="categorical" )
补充说明
- 不能直接把Azure Dataset对象传入
ImageDataGenerator,它仅支持本地路径或可迭代的数据生成器,必须先将数据集下载/挂载到计算节点本地路径再调用 - 如果数据集体积较大,可以把
as_download()换成as_mount(),无需全量下载即可直接访问路径,train.py代码不需要做任何修改
内容的提问来源于stack exchange,提问作者user2179550
相关产品推荐
相关产品推荐

