创建一个临时的Keras会话?

时间:2018-07-05 14:59:58

标签: python tensorflow keras

我有一堆模型在浮动,我将它们克隆,交叉验证,进行超参数选择以及您所拥有的。这样,我的.clear_session()全局会话可能会变得很糟糕。每个various threads的解决方案是调用multiprocessing。但是,这将丢弃我要保留的所有模型。一种选择是在def score_model(**hyperparameters): with tf.Graph().as_default() my_model = build_model(**hyperparameters) with tf.Session() as sess: my_model.train(X,y) score = my_model.score() # now it's all gone, I have the score, so I don't need the model anymore # the rest of my_model should get garbage collected, hooray! return score 线程中训练我的所有模型。但是,就像使用Tensorflow那样为每个模型实例化一个新会话将很方便:

keras

我可以用sess.as_default()做这种事情吗?

更新

i=2方法使我的内核崩溃。我的内存似乎并没有用尽,也没有任何错误。在以下循环中,崩溃前甚至无法进入from sklearn.datasets import load_iris import numpy as np import sklearn import keras import keras.wrappers.scikit_learn import tensorflow as tf import keras.models import os def sessioned(f): def sessioned_f(self, *args, **kwargs): if not hasattr(self, "sess"): self.sess = tf.Session() with self.sess.as_default(): return f(self, *args, **kwargs) return result return sessioned_f class LogisticRegression(keras.wrappers.scikit_learn.KerasClassifier): def __init__(self, n_epochs=100, **kwargs): self.n_epochs = n_epochs super().__init__(**kwargs) @sessioned def fit(self, X, y,**kwargs): # get the shape of X and one hot y self.input_shape = X.shape[-1] self.label_encoder = sklearn.preprocessing.LabelEncoder() self.label_encoder.fit(y) self.output_shape = len(self.label_encoder.classes_) label_encoded = self.label_encoder.transform(y).reshape((-1,1)) y_onehot = sklearn.preprocessing.OneHotEncoder().fit_transform(label_encoded).toarray() super().fit(X,y_onehot,epochs=self.n_epochs,verbose=1,**kwargs) return self @sessioned def predict_proba(self, X): return super().predict_proba(X) def check_params(self, params): #fuckit pass @sessioned def __call__(self): # the build_fn thing # create model model = keras.models.Sequential() model.add(keras.layers.Dense(self.output_shape, input_dim=self.input_shape, kernel_initializer="normal", activation="softmax")) # Compile model model.compile(loss='categorical_crossentropy', optimizer='adam') return model data = load_iris() i=0 while True: print(i) graph = tf.Graph() with graph.as_default(): model = LogisticRegression() model.fit(data.data, data.target) model.sess.close() del model i+=1 del graph

{{1}}

1 个答案:

答案 0 :(得分:0)

您可以完全按照您的描述使用Keras,但您可以运行Keras代码,而不是在with语句中运行Tensorflow代码。

要设置会话,您将使用

with sess.as_default()

这里是带有更多信息的链接: https://blog.keras.io/keras-as-a-simplified-interface-to-tensorflow-tutorial.html

我还发现查看keras.backend内部的源代码很有帮助。如果您查看get_session(),您会看到Keras首先查看是否存在tensorflow默认会话。否则,它将通过set_session()使用设置为Keras的会话。最后,如果未设置会话,则会创建一个会话。

相关问题