我有32 GB的RAM,并在Windows 7机器上使用Keras顺序神经网络训练大型数据集。由于数据集的大小,我选择使用fit_generator
每批约5000个样本,每个样本约有500个特征。我在生成器中有gc.collect()
来解决潜在的内存泄漏问题,这有助于此模型的先前迭代。
对于第一个时期的前几个步骤,内存消耗很低。然后在大约15步之后,它开始增加和减少,直到它最终以27.6 GB的速度封顶。
有人可以解释为什么内存使用会随着时间的推移而增加吗此外,第一个时代已有数百个步骤,内存仍为27.6 GB。这有什么意义吗?
NN本身是3层深,每个神经元有50个神经元。我知道存储权重有一些内存要求,但这会随着时间的推移而增加吗?
def gen_data(max,rows,skip):
import gc
while True:
data = pd.read_csv(csv,skiprows=range(1,skip),nrows=rows,index_col=0)
x,y = features(data)
yield x,y
skip += rows
if max is not None and skip >= max:
skip = 0
gc.collect()
model=Sequential()
model.add(Dense(50, input_dim = train_shape, activation='linear'))
model.add(LeakyReLU())
model.add(Dropout(0.2))
model.add(Dense(50, input_dim = train_shape, activation='linear'))
model.add(LeakyReLU())
model.add(Dropout(0.2))
model.add(Dense(50, input_dim = train_shape, activation='linear'))
model.add(LeakyReLU())
model.add(Dropout(0.2))
model.add(Dense(1,activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam')
hist = model.fit_generator(gen_data(8000000,5000),epochs=50,
steps_per_epoch=int(8000000/5000),verbose=1,callbacks=callbacks_list,
class_weight=class_weight,validation_steps=10,validation_data=gen_data(800000,80000))
- 编辑 -
删除validation_steps和validation_data时,进程不会在内存中爆炸。这似乎是奇怪的行为,因为我不希望验证数据在纪元结束之前使用。有什么想法吗?