0

随着我的数据不断增加(目前超过 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 分钟相比)。我知道它会更长,但我没想到会这么糟糕。

有没有更好的方法来做到这一点,或者我正在做一些让事情变得更糟的事情。

4

0 回答 0