我正在使用 pygad 作为神经网络,我想知道为什么它在每一代之后都使用 RAM?问题是我让它继续运行,然后当它开始使用越来越多的 RAM 时,RAM 使用量突然激增并导致崩溃。
这是我要重现的代码:
import pygad
import pygad.kerasga
import pandas as pd
import numpy as np
train = np.random.rand(1000000,50)
label = np.random.rand(1000000,1)
def fitness_func(ga_instance, solution, solution_idx):
global train, dataset, model
#for batch in dataset:
# train['pred'] = pygad.kerasga.predict(model=model, solution=solution, data=batch, verbose=1, batch_size=2**13)
t0 = datetime.datetime.now()
preds = pygad.kerasga.predict(model=model, solution=solution, data=train, verbose = 0, batch_size = 2**13)
t1 = datetime.datetime.now()
print(t1 - t0)
scores = label[preds>0.7].mean() - label[preds<0.3].mean()
score = scores.mean()
return score
def on_generation(ga_instance):
print(ga_instance.generations_completed, f"Fitness = {ga_instance.best_solution()[1]}")
input_layer = tf.keras.layers.Input(shape = (train.shape[1]))
dense_layer1 = tf.keras.layers.Dense(units = train.shape[1], activation = tf.keras.layers.LeakyReLU(alpha=0.01))(input_layer)
output_layer = tf.keras.layers.Dense(units = 1)(dense_layer1)
model = tf.keras.Model(inputs=input_layer, outputs=output_layer)
keras_ga = pygad.kerasga.KerasGA(model=model, num_solutions=5)
ga_instance = pygad.GA(num_generations = 50, num_parents_mating = 2, initial_population=keras_ga.population_weights, fitness_func = fitness_func,\
on_generation=on_generation)
ga_instance.run()
即使数据集很小,RAM 也会稳步增加。有没有可以用来防止这种情况的设置?
您可以尝试在每次生成后通过调用
gc.collect()
来清理 RAM。
在使用 Python 垃圾回收之前,代码使用了我的 32GB RAM 的 17%。使用GC后,只使用了~6%。所以,值得一试。