【发布时间】:2020-08-23 02:18:26
【问题描述】:
我已经使用 CPU 在 C++ 中实现了一个网络,我正在尝试使用 GPU 和 python 来训练它。我面临的问题是输入非常大(而且稀疏),大约有 50000 个输入神经元,通常只有 30 个被激活。
我的模型如下所示:
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) (None, 24576) 0
__________________________________________________________________________________________________
input_2 (InputLayer) (None, 24576) 0
__________________________________________________________________________________________________
dense_1 (Dense) (None, 256) 6291712 input_1[0][0]
__________________________________________________________________________________________________
dense_2 (Dense) (None, 256) 6291712 input_2[0][0]
__________________________________________________________________________________________________
leaky_re_lu_1 (LeakyReLU) (None, 256) 0 dense_1[0][0]
__________________________________________________________________________________________________
leaky_re_lu_2 (LeakyReLU) (None, 256) 0 dense_2[0][0]
__________________________________________________________________________________________________
concatenate_1 (Concatenate) (None, 512) 0 leaky_re_lu_1[0][0]
leaky_re_lu_2[0][0]
__________________________________________________________________________________________________
dense_3 (Dense) (None, 32) 16416 concatenate_1[0][0]
__________________________________________________________________________________________________
leaky_re_lu_3 (LeakyReLU) (None, 32) 0 dense_3[0][0]
__________________________________________________________________________________________________
dense_4 (Dense) (None, 32) 1056 leaky_re_lu_3[0][0]
__________________________________________________________________________________________________
leaky_re_lu_4 (LeakyReLU) (None, 32) 0 dense_4[0][0]
__________________________________________________________________________________________________
dense_5 (Dense) (None, 1) 33 leaky_re_lu_4[0][0]
==================================================================================================
Total params: 12,600,929
Trainable params: 12,600,929
Non-trainable params: 0
我还尝试将大约 3 亿个输入/输出值输入我的网络。 不用说,数据太多了,无法一次全部放到我的 GPU 上。
出于速度目的,我生成了稀疏矩阵,每个矩阵代表大约 100000 个输入,并将它们保存在内存中(大约 50Gb)。我可以像这样轻松加载它们而不会损失太多速度:
# loads both the inputs and the output for the given chunk (100000 inputs/outputs) from the memory
trainX1,trainX2,trainY = readNumpyChunkAndCreateInput(chunk)
我用它来训练我的网络,如下所示:
for chunk in chunks:
trainX1,trainX2,trainY = readNumpyChunkAndCreateInput(chunk)
_res = model.fit([trainX1,trainX2], trainY, epochs=1,steps_per_epoch=1,verbose=0)
loss = list(_res.history.values())[0]
totalLoss += loss[0]
显然这无论如何都不是最优的。我知道 Keras/TensorFlow 中有一个叫做 data generators 的东西,但遗憾的是我不知道如何在我的特定情况下使用它们,因为所有教程都处理密集输入。
如果有人可以在这里帮助我,我很高兴!
您好, 芬兰人
编辑 1
我加载数据的方式:
filePath = os.path.abspath(os.path.dirname(sys.argv[0]))
path = filePath + "\\data\\" + name + "\\"
indices1 = np.load(path + 'indices1.npy')
indices2 = np.load(path + 'indices2.npy')
outputs = np.load(path + 'outputs.npy')
meta = open(path + 'meta.txt', "r")
metaInf = meta.readlines()[0].split(" ")
meta.close()
entry1Count = int(metaInf[0])
entry2Count = int(metaInf[1])
lineCount = int(metaInf[2])
values1 = tf.ones(entry1Count)
values2 = tf.ones(entry2Count)
shape = (lineCount, 6 * 64 * 64)
trainX1 = tf.SparseTensor(
indices=indices1,
values=values1,
dense_shape=shape
)
trainX2 = tf.SparseTensor(
indices=indices2,
values=values2,
dense_shape=shape
)
return trainX1, trainX2, outputs
【问题讨论】:
-
您的磁盘上存储的数据格式是什么?
-
它是一个稀疏的 numpy 数组(实际上两个输入都是 2)
-
是存储为单个
.npy50 GB 文件还是多个文件? -
我将 300M 个集合分成更小的块,每个块有 100k 个集合。 100k 大约 20MB。在我的驱动器上看起来像这样:prntscr.com/u41am4
-
我刚刚做了一些研究。 “train_on_batch”可以在这种情况下工作吗?
标签: python tensorflow keras sparse-matrix