如何从CSV中加载大型数据集到Keras?

6

我想使用TensorFlow和Keras来训练一个基于SURF特征的网络,这些特征是从多张图片中获得的。我将所有的特征存储在一个CSV文件中,该文件有以下列:

 [ID, Code, PointX, PointY, Desc1, ..., Desc64]

“ID”列是存储所有值时,由pandas自动创建的自增索引。 “Code”列是点的标签,这只是一个数字,通过将实际代码(字符串)与数字配对获得。 “PointX/Y”是给定类别图像中找到的点的坐标,“Desc#”是该点对应描述符的浮点值。
CSV文件包含在所有20,000个图像中找到的所有关键点和描述符。这使我拥有近60GB的磁盘空间,显然无法放入内存中。
我一直在尝试使用pandas加载文件的批次,然后将所有值放入numpy数组,然后适合我的模型(仅有3层的Sequential模型)。我使用了以下代码:
chunksize = 10 ** 6
for chunk in pd.read_csv("surf_kps.csv", chunksize=chunksize):
    dataset_chunk = chunk.to_numpy(dtype=np.float32, copy=False)
    print(dataset_chunk)
    # Divide dataset in data and labels
    X = dataset_chunk[:,9:]
    Y = dataset_chunk[:,1]
    # Train model
    model.fit(x=X,y=Y,batch_size=200,epochs=20)
    # Evaluate model
    scores = model.evaluate(X, Y)
    print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

第一个块加载时还好,但是当循环获取另一个块时,准确性和损失都停留在0。

我尝试加载所有这些信息的方式有问题吗?

提前感谢!

------ 编辑 ------

现在我创建了一个简单的生成器,如下所示:

def read_csv(filename):
    with open(filename, 'r') as f:
        for line in f.readlines():
            record = line.rstrip().split(',')
            features = [np.float32(n) for n in record[9:73]]
            label = int(record[1])
            print("features: ",type(features[0]), " ", type(label))
            yield np.array(features), label

并使用fit_generator:

tf_ds = read_csv("mini_surf_kps.csv")
model.fit_generator(tf_ds,steps_per_epoch=1000,epochs=20)

我不知道为什么,在第一次迭代开始之前我总是会遇到一个错误:

ValueError: Error when checking input: expected dense_input to have shape (64,) but got array with shape (1,)

模型的第一层具有input_dim=64,生成的特征数组的形状也为64。
2个回答

2

0

如果您正在使用Tf 2.0,您可以验证数据集内容是否正确。您只需执行以下操作:

print(next(iter(tf_ds)))

查看数据集的第一个元素,并检查它是否与模型期望的输入匹配。


太好了,我发现我正在使用一个转置的数组来输入网络,这就是我的问题所在。谢谢! - Tomas Perez Cambet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接