HDF5数据集只存储0 /空值

问题描述 投票:0回答:1

我正在将CSV文件写入HDF5文件,以便在不占用内存的情况下以更好的方式加载信息。我的CSV文件包含要通过字典转换为相应值的索引。

CSV文件很大(索引的值为4 GB),并且相应的值为512大小的数组。要创建数据集,我首先在H5文件中定义数据集,然后逐块读取CSV文件,以便它使用适当数量的RAM

num_lines = 1000000
chunksize = 100000
num_features = 512

with h5py.File('./data/dataset.h5', 'w') as h5f:

    # use num_features-1 if the csv file has a column header
    dset1 = h5f.create_dataset('paragraph_embeddings',
                               shape=(num_lines, num_features),
                               compression=None,
                               dtype='float32')
    dset2 = h5f.create_dataset('sentence_embeddings',
                               shape=(num_lines, num_features),
                               compression=None,
                               dtype='float32')
    dset3 = h5f.create_dataset('labels',
                               shape=(num_lines,),
                               compression=None,
                               dtype='int32')

    # Read csv in chunks so that RAM does not overflow
    for i in range(0, num_lines, chunksize):

        df = pd.read_csv(csv_path,
                header=None,
                nrows=chunksize, # number of rows to read at each iteration
                skiprows=i)   # skip rows that were already read
        df.columns = ["para_index", "sentence_index", "label"]

        # Get embeddings from dictionaries (para_mappings and sentence_mappings)
        paragraph_embeddings = df["para_index"].map(para_mappings)
        sentence_embeddings = df["sentence_index"].astype(str).map(sentence_mappings)
        label = df["label"]

        # Append to the datasets
        dset1[i:i+chunksize, num_features:] = paragraph_embeddings
        dset2[i:i+chunksize, num_features:] = sentence_embeddings
        dset3[i:i+chunksize] = label

我使用df.map函数将索引映射到其相应的值。在那之后,我得到了嵌入(或如前所述的512大小的数组)。之后,我将它们附加到其相应的数据集。

但是,为了测试,我使用以下命令从H5文件中打印嵌入内容:

with h5py.File('./data/dataset.h5', 'r') as h5f:
    print('Embedding', h5f['paragraph_embeddings'][2])

并且我得到一个零数组(大小为512)作为输出。

有人可以引导我在这里出问题吗?根据我的估计,应该是将嵌入“附加”到数据集的地方。我认为,我不是要附加这些值并在那里做错什么。

而且,当我测试标签时,它们出来是正确的。所以,我想,这主要是在这一行强调我的问题:

dset1[i:i+chunksize, num_features:] = paragraph_embeddings

python csv hdf5 h5py word-embedding
1个回答
0
投票

问题出在这一行:

paragraph_embeddings = df["para_index"].map(para_mappings)

这给了我一个数据块大小的数据帧,每个元素都是一个numpy数组(大小为512)。当我将其写入数据集中时,将数据输入为以下形式是不接受的:

dset1[i:i+chunksize] = paragraph_embeddings

给我一个错误,说它无法将大小为chunk-size的数据输入大小为[chunk-size, 512]的数据集中。这给了我一个线索,先将数据框转换为[chunk-size, 512]形状的numpy数组,然后将其添加到数据集中。如预期那样有效。

paragraph_embeddings = np.array(df["para_index"].map(para_mappings).tolist())
© www.soinside.com 2019 - 2024. All rights reserved.