Memory management Keras中的GridSearch+;导致资源枯竭的张量流

Memory management Keras中的GridSearch+;导致资源枯竭的张量流,memory-management,out-of-memory,gpu,keras,tensorflow-gpu,Memory Management,Out Of Memory,Gpu,Keras,Tensorflow Gpu,我知道这是一个反复出现的错误,我理解是什么导致了它。 例如,使用163张150x150的图像运行此模型会给我带来错误(但是我不清楚为什么设置batch_size Keras似乎仍然试图在GPU中一次分配所有图像): 鉴于此,我将图像大小减少到30x30(正如预期的那样,这导致了精度下降)。但是,在此模型中运行网格搜索会耗尽资源 model = KerasClassifier(build_fn=create_model, verbose=0) # grid initial weight, bat

我知道这是一个反复出现的错误,我理解是什么导致了它。 例如,使用163张150x150的图像运行此模型会给我带来错误(但是我不清楚为什么设置batch_size Keras似乎仍然试图在GPU中一次分配所有图像):

鉴于此,我将图像大小减少到30x30(正如预期的那样,这导致了精度下降)。但是,在此模型中运行网格搜索会耗尽资源

model = KerasClassifier(build_fn=create_model, verbose=0)

# grid initial weight, batch size and optimizer
sgd  = optimizers.SGD(lr=0.0005)
rms  = optimizers.RMSprop(lr=0.0005)
adag = optimizers.Adagrad(lr=0.0005)
adad = optimizers.Adadelta(lr=0.0005)
adam = optimizers.Adam(lr=0.0005)
adamm = optimizers.Adamax(lr=0.0005)
nadam = optimizers.Nadam(lr=0.0005)

optimizers = [sgd, rms, adag, adad, adam, adamm, nadam]
init = ['glorot_uniform', 'normal', 'uniform', 'he_normal']
batches = [32, 64, 128]
param_grid = dict(optim=optimizers, batch_size=batches, init=init)
grid = GridSearchCV(estimator=model, param_grid=param_grid)
grid_result = grid.fit(X_train, y_train)

# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
我想知道是否有可能在网格搜索使用的每个组合之前“清理”东西(不确定我是否清楚,这对我来说都是新的)

编辑

使用
fit_生成器
也会产生相同的错误:

def generator(features, labels, batch_size):
    # Create empty arrays to contain batch of features and labels#
    batch_features = np.zeros((batch_size, size, size, 1))
    batch_labels = np.zeros((batch_size, n_targets))
    while True:
        for i in range(batch_size):
            # choose random index in features
            index = np.random.choice(len(features),1)
            batch_features[i] = features[index]
            batch_labels[i] = labels[index]
        yield batch_features, batch_labels

sgd  = optimizers.SGD(lr=0.0005)
rms  = optimizers.RMSprop(lr=0.0005)
adag = optimizers.Adagrad(lr=0.0005)
adad = optimizers.Adadelta(lr=0.0005)
adam = optimizers.Adam(lr=0.0005)
adamm = optimizers.Adamax(lr=0.0005)
nadam = optimizers.Nadam(lr=0.0005)

optim = [rms, adag, adad, adam, adamm, nadam]
init = ['normal', 'uniform', 'he_normal']

combinations = [(a, b) for a in optim for b in init]
for combination in combinations:
    init  = combination[1]
    optim = combination[0]
    model = create_model(init=init, optim=optim)
    model.fit_generator(generator(X_train, y_train, batch_size=32),
                        steps_per_epoch=X_train.shape[0] // 32,
                        epochs=100, verbose=0, validation_data=(X_test, y_test))
    scores = model.model.evaluate(X_test, y_test, verbose=0)
    print("%s: %.2f%% Model %s %s" % (model.model.metrics_names[1], scores[1]*100, optim, init))

您应该使用生成器+
生成
,它们会从内存中丢弃已使用的数据。请查看我的回答类似的问题。

您应该使用生成器+
生成
,它们会从内存中丢弃已使用的数据。请查看我的答案,以回答类似的问题。

在每次运行培训/评估后,您必须清除tensorflow会话

K.clear_session()

使用
K
作为tensorflow后端

每次运行培训/评估后,您必须清除tensorflow会话

K.clear_session()


使用
K
作为tensorflow后端

我如何将它与GridSearch结合使用呢?GridSearch似乎不接受生成器,但您可以使用for循环模拟GridSearch并保存模型。交叉验证甚至会在每次循环后洗牌数据集。一个简单的例子是这样的:这个解决方案在运行了一些搜索之后给了我ResourceExhausterRor。你介意发布你的生成器吗?“你只包括了训练部分。当然,就这么做了,@regina_fallangi。”。谢谢您的时间。我如何将它与GridSearch结合使用?GridSearch似乎不接受生成器,但您可以使用for循环模拟GridSearch并保存模型。交叉验证甚至会在每次循环后洗牌数据集。一个简单的例子是这样的:这个解决方案在运行了一些搜索之后给了我ResourceExhausterRor。你介意发布你的生成器吗?“你只包括了训练部分。当然,就这么做了,@regina_fallangi。”。感谢您的时间。完成此操作后,错误更改为类似于
ValueError:Tensor(“Variable_12:0”,shape=(64,),dtype=float32_ref)的内容必须来自与Tensor(“rho_4/read:0”,shape=(),dtype=float32”)相同的图形。
我是否缺少正确的使用方法?我将K.clear_session()放在循环的最后一行后面。@pceccon我认为原因是在网格的所有搜索中引用了同一个优化器。请记住,优化器只是符号图的一部分,因此您必须以与模型相同的方式重新创建优化器。但由于我在优化器上循环,这对我来说没有多大意义。@pceccon只需将这些参数视为网格中的附加超参数,然后使用这些参数创建optimizer X的实例。它被称为工厂模式,请在此处查看更多信息:完成此操作后,错误更改为
ValueError:Tensor(“Variable_12:0”,shape=(64,),dtype=float32_ref)必须来自与Tensor相同的图形(“rho_4/read:0”,shape=(),dtype=float32)。
我是否缺少正确的使用方法?我将K.clear_session()放在循环的最后一行后面。@pceccon我认为原因是在网格的所有搜索中引用了同一个优化器。请记住,优化器只是符号图的一部分,因此您必须以与模型相同的方式重新创建优化器。但由于我在优化器上循环,这对我来说没有多大意义。@pceccon只需将这些参数视为网格中的附加超参数,然后使用这些参数创建optimizer X的实例。这称为工厂模式,请在此处查看更多信息: