Caffe:将 CSV 文件转换为 HDF5

Posted

技术标签:

【中文标题】Caffe:将 CSV 文件转换为 HDF5【英文标题】:Caffe: Converting CSV file to HDF5 【发布时间】:2016-12-13 06:42:00 【问题描述】:

我对 Caffe 框架(用于定义和训练深度学习模型)有所了解

作为我的第一个程序,我想编写一个程序,使用fer2013 数据集来训练和测试“人脸情绪识别”任务

我下载的数据集是“CSV”格式。据我所知,要使用 Caffe,数据集格式必须是“lmdb”或“hdf5”。

所以看来我要做的第一件事就是将我的数据集转换成 hdf5 或 lmbd 格式。

这是我最初尝试的一个简单代码:

import pandas as pd
import numpy as np
import csv

csvFile = pd.HDFStore('PrivateTest.csv')
PrivateTestHDF5 = csvFile.to_hdf(csvFile)

print len(PrivateTestHDF5)

但它不起作用,我得到这个错误:

“无法打开/创建文件'PrivateTest.csv”

我已经搜索了很多,我找到了这个link,但我仍然无法理解它是如何从 CSV 文件中读取的。

我也没有安装Matlab。

如果有人可以帮助我,我会很高兴。此外,如果有任何关于为 Kaggle 网站上的数据集或任何其他数据集(不在 caffe 网站上的人)编写 caffe 模型的建议

【问题讨论】:

您应该具体说明您的问题,阅读***.com/help/how-to-ask。特别是这与 Caffe 或 matlab 无关(尽管它们可能是您的总体问题的组成部分,但它们与问题没有直接关系)。我会看一下pd.HDFStore 的文档字符串 @mgilbert 我不知道在这里谈论 Caffe 是没有用的。您认为编辑我的问题更好吗? (删除 caffe 标签?) 是的,我会将您的问题限制在一个特定问题上,例如从 csv 读取或写入 hdf5 文件。我会看看pandas.pydata.org/pandas-docs/version/0.18.1/tutorials.html,它很好地概述了两者 能否说得更具体些? 【参考方案1】:

您的输入数据不必在 lmdb 或 hdf5 中。您可以从 csv 文件输入数据。你所要做的就是使用一个 ImageData 输入层,比如这个:

layer 


name: "data"
  type: "ImageData"
  top: "data"
  top: "label"
  include 
    phase: TRAIN
  
  transform_param 
    mirror: false
    crop_size: 224
    mean_file: "./supporting_files/mean.binaryproto"
  
  image_data_param 
    source: "./supporting_files/labels_train.txt"
    batch_size: 64
    shuffle: true
    new_height: 339
    new_width: 339
  

这里,“./supporting_files/labels_train.txt”文件只是一个 csv 文件,其中包含作为常规图像存储在文件系统中的输入图像的路径。

这通常是向模型提供数据的最简单方法。但是如果你真的必须使用 HDF5 文件,你可以使用类似这个函数的东西:

import h5py
import sys
import numpy as np



 def create_h5_file(labels,file_name):
        nr_entries = len(labels)
        images = np.zeros((nr_entries, 3, width, height), dtype='f4')
        image_labels = np.zeros((nr_entries, nr_labels_per_image), dtype='f4')
        for i, l in enumerate(labels):

            img = caffe.io.load_image(l[0])

            # pre process and/or augment your data 

            images[i] = img

            image_labels[i] = [int(x) for x in l[1]]

        with h5py.File(file_name, "w") as H:
            H.create_dataset("data", data=images)
            H.create_dataset("label", data=image_labels)

其中 file_name 是一个带有 hdf5 输出文件路径的字符串,标签是,标签是一个元组数组,例如 ("/path/to/my/image",["label1","label2",. ..,"labeln"])。

请注意,此函数适用于每个图像具有多个标签的数据集(使用 hdf5 而不是 csv 文件的一个正当理由),但您可能只需要每个图像一个标签。

【讨论】:

非常感谢。我遇到了另一个问题。文件“create_imagenet_mean.sh”有这一行: $TOOLS/compute_image_mean $EXAMPLE/ilsvrc12_train_lmdb \ 所以看来我需要一个 lmdb 版本的数据才能使用这个脚本。我说的对吗? 还有另一个问题。此代码是否适用于该数据集?因为在该数据集中,标签和图像在同一个文件中,我不知道如何更改该代码。如果你能帮助我,我将不胜感激。谢谢:) @Mppl【参考方案2】:

有点晚了,但想指出,如果 csv 文件太大而无法加载到内存中,您可以使用 pandas "chunksize" 来拆分文件并将块一一加载到 HDF5:

import pandas as pd

csvfile = 'yourCSVfile.csv'
hdf5File = 'yourh5File.h5'

tp = pd.read_csv('CSVfile', chunksize=100000)

for chunk in tp:
   chunk.to_hdf(hdf5File,  key = 'data', mode ='a', format='table', append = True)

请注意,append = True 用于表格格式。

【讨论】:

以上是关于Caffe:将 CSV 文件转换为 HDF5的主要内容,如果未能解决你的问题,请参考以下文章

将数百个 csv 文件转换为 hdf5 文件

将大 csv 转换为 hdf5

使用 hdf5 作为 caffe 输入,错误:HDF5Data 不转换数据

将 TensorFlow 模型转换为 Keras hdf5

hdf5 和 pickle 比原始 csv 文件占用更多空间

使用 Caffe 训练数据集时多次加载 HDF5 文件