我正在尝试将Keras与TensorFlow结合使用,以根据我从几张图像中获得的SURF功能来训练网络。我将所有这些功能存储在具有以下列的CSV文件中:
[ID, Code, PointX, PointY, Desc1, ..., Desc64]
“ ID”列是当我存储所有值时由熊猫创建的自动增量索引。 “代码”列是该点的标签,这仅仅是我将实际代码(是字符串)与数字配对而得到的数字。 “ PointX / Y”是在给定类的图像中找到的点的坐标,“ Desc#”是该点的相应描述符的浮点值。
CSV文件包含在所有20.000张图像中找到的所有关键点和描述符。这使我的磁盘总容量接近60GB,显然我的内存容量不足。
我一直在尝试使用pandas加载文件批次,然后将所有值放入numpy数组中,然后拟合我的模型(仅3层的顺序模型)。我已经使用以下代码来做到这一点:
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。
答案 0 :(得分:0)
我认为最好使用tf.data.Dataset,这可能会有所帮助:
https://www.tensorflow.org/beta/tutorials/load_data/csv
Streaming large training and test files into Tensorflow's DNNClassifier
答案 1 :(得分:0)
如果使用的是Tf 2.0,则可以验证数据集的内容是否正确。 您只需通过
print(next(iter(tf_ds)))
查看数据集的第一个元素,并检查其是否与模型期望的输入匹配。
答案 2 :(得分:0)
关于此的很棒的教程,请访问:
https://machinelearningmastery.com/load-machine-learning-data-python/
# Load CSV (using python)
import csv
import numpy
filename = 'pima-indians-diabetes.data.csv'
raw_data = open(filename, 'rt')
reader = csv.reader(raw_data, delimiter=',', quoting=csv.QUOTE_NONE)
x = list(reader)
data = numpy.array(x).astype('float')
print(data.shape)
简单地:
import numpy
filename = 'pima-indians-diabetes.data.csv'
raw_data = open(filename, 'rt')
data = numpy.loadtxt(raw_data, delimiter=",")
print(data.shape)