Caffe:将CSV文件转换为HDF5

时间:2016-08-07 10:16:39

标签: python matlab csv hdf5 caffe

我已经了解了一些关于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网站上的人)

2 个答案:

答案 0 :(得分:3)

您的输入数据不必是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文件的一个正当理由),但每个图像可能只需要一个标签。

答案 1 :(得分:-1)

有点晚了,但是想指出如果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适用于表格格式。