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的主要内容,如果未能解决你的问题,请参考以下文章
使用 hdf5 作为 caffe 输入,错误:HDF5Data 不转换数据