我有一堆模型在浮动,我将它们克隆,交叉验证,进行超参数选择以及您所拥有的。这样,我的.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}}
答案 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的会话。最后,如果未设置会话,则会创建一个会话。