随着我的数据不断增加(目前超过 30GB),并且我无法加载到内存中,我刚刚开始使用数据集(因此我对它比较陌生)。
我有两个 csv 文件,一个带有热编码标签 [0,0,0,0,1,0,0...] 的每一行(labels.csv
),另一个(mixture.csv
)带有实际数据本身。每行长 1901 个浮点数,代表一维数据(如光谱);因此,没有特征列。
传统上,我只是将整个内容读入并存储起来,我这样做了
chunksize = 10 ** 6
chunk_list = []
for chunk in pd.read_csv('mixture.csv', header = None, chunksize=chunksize, dtype=np.float16):
chunk_list.append(chunk)
All = pd.concat(chunk_list)
和类似的东西labels
。然后我会用传统的方法来分离训练、标签和验证,
X_train, X_test, y_train, y_test = train_test_split(All, labels, test_size=0.25, random_state=12)
紧随其后的是重塑,
X_train = X_train.reshape(X_train.shape + (1,))
试图改变我的东西以便它可以工作tf.data
(经过相当多的阅读和搜索),
mixture_types = []
for i in range(1901):
mixture_types.append(tf.float32)
dataset = tf.data.experimental.CsvDataset('/content/mixture.csv', mixture_types, header=False)
mixture_label_types = []
for i in range(len(pure)):
mixture_label_types.append(tf.float32)
label_dataset = tf.data.experimental.CsvDataset('label.csv', mixture_label_types, header=False)
是的,我知道可能有更好的方法来做 d-type,但我是从这里阅读的,这是我想出的最好的方法。
现在看来,这会将每一列作为一个功能读取,因此为了摆脱它,我遵循了本教程中所做的操作,
def pack_row(*row):
features = tf.stack(row[0:],1)
return features
packed_ds = dataset.batch(10000).map(pack_row).unbatch()
packed_label = label_dataset.batch(10000).map(pack_row).unbatch()
并且由于 中的同一行mixture.csv
对应于同一行中的标签labels.csv
,
together_dataset = tf.data.Dataset.zip((packed_ds, packed_label))
together_dataset = together_dataset.shuffle(10000, reshuffle_each_iteration=True)
together_dataset = together_dataset.batch(15)
当我去运行它时,
model.fit(together_dataset,
epochs=1,
callbacks = [best_model],
verbose=2)
它比全部加载到内存中花费的时间要长得多(例如 6 分钟与 90 分钟相比)。我知道它会更长,但我没想到会这么糟糕。
有没有更好的方法来做到这一点,或者我正在做一些让事情变得更糟的事情。