python - 为 Keras 分类任务从 json 注释文件加载自定义数据集
问题描述
我是深度学习的新手,想使用 Keras 实现一个简单的分类任务。我的数据集包含超过 2000 张图像,对于每张图像,我都有一个相应的 json 文件,其中包含该图像的标签。以下是加载 json 文件并创建 X(图像)和 Y(标签)数组的代码:
X = []
Y = []
with concurrent.futures.ProcessPoolExecutor() as executor:
# Get a list of files to process
str = jsonpath + '/*.json'
#print(str)
json_files = glob.glob(str)
for jsonfile,y in zip(json_files, executor.map(create_array, json_files)):
X.append(y[0])
Y.append(y[1])
其中函数 create_array 定义如下:
def create_array(jsonfile):
array_list = []
y_list = []
with open(jsonfile) as f:
data = json.load(f)
name = data['annotation']['data_filename']
img = cv2.imread(imgDIR + '/' + name)
array_list.append(img)
l = data['annotation']['data_annotation']['classification'][0]['classification_label']
y_list.append(l)
return array_list, y_list
它适用于少量图像,例如 15,但对于整个 2000 张图像集,程序会自动终止,或者有时会给出错误“MemoryError:内存不足”。有没有一种有效的方法来做到这一点?如何加快此数据预处理部分以将其作为 keras 分类模型的输入?
解决方案
看起来您的图像已经准备好进行训练,而您的预处理只是加载文件。在加载数据时,json 格式可能不是最快的方法。如果您使用诸如泡菜之类的东西来保存和加载图像,您可能会体验到速度提升。
另一个问题是如何有效地将数据传递给 keras。通常你会使用model.fit
,但由于并非所有数据都适合你的记忆,你可以使用model.fit_generator
Ther keras doc给我们以下提示:
为了提高效率,生成器与模型并行运行。例如,这允许您在 CPU 上对图像进行实时数据增强,同时在 GPU 上训练您的模型。
使用 keras.utils.Sequence 保证了排序,并保证在使用 use_multiprocessing=True 时每个 epoch 的每个输入的单一使用。
这是一个如何实现这种生成器的示例。
推荐阅读
- sas - 根据公共数据字段比较不同行之间的开始/结束日期
- c++ - 在 C++ 中,最好不要对使用 RTTI 的函数参数使用按值传递?
- c - 结构是巨大的。为什么?
- angularjs - 有没有办法使用角度材料拖放来调整大小
- python - Google App Engine:禁用服务的会话中间件
- amazon-web-services - Jenkins 启动 AWS EC2 实例的工作?
- c# - C# 正则表达式在字符串匹配后查找并删除文本
- python - 在linux中打开文件时出现UnicodeDecodeError,但在Windows中打开相同的文件
- google-apps-script - 有没有办法在今天将其写入 Google 表格中的单元格时冻结它?
- c# - 如何发送图像 base64 Web 服务 POST C#