由于超参数调优似乎是为了同一个任务训练不同的模型,我想并行训练它们是一个好主意,以获得一些时间。然而,我的尝试非常不成功,因为在执行代码时出现了多个错误。我想知道使用keras是否需要我以不同的方式编写多线程,或者问题是否在其他地方。
下面是我写的(我试图计算dropout对自定义度量的最小值的影响):
from threading import Thread
class FitModel(Thread):
def __init__(self, params):
Thread.__init__(self)
self.params = params
def run(self):
DC=DeltaCallback(verbose=0) #custom metric
model=keras.models.Sequential([
keras.layers.Conv1D(64,11,activation="relu",padding="SAME",input_shape=(700,1)),
keras.layers.BatchNormalization(),
keras.layers.AvgPool1D(pool_size=2),
keras.layers.Conv1D(128,11,activation="relu",padding="SAME"),
keras.layers.BatchNormalization(),
keras.layers.AvgPool1D(pool_size=2),
keras.layers.Conv1D(256,11,activation="relu",padding="SAME"),
keras.layers.BatchNormalization(),
keras.layers.AvgPool1D(pool_size=2),
keras.layers.Conv1D(512,11,activation="relu",padding="SAME"),
keras.layers.BatchNormalization(),
keras.layers.AvgPool1D(pool_size=2),
keras.layers.Conv1D(512,11,activation="relu",padding="SAME"),
keras.layers.BatchNormalization(),
keras.layers.AvgPool1D(pool_size=2),
keras.layers.Flatten(),
keras.layers.Dropout(self.params[0]),
keras.layers.Dense(4096,activation="relu"),
keras.layers.Dropout(self.params[1]),
keras.layers.Dense(4096,activation="relu"),
keras.layers.Dense(256,activation="softmax")
])
model.compile(loss="sparse_categorical_crossentropy",
optimizer=keras.optimizers.RMSprop(learning_rate=0.00001),
metrics=["accuracy"])
model.fit(X_train,y_train,batch_size=100,epochs=50,validation_data=(X_valid,y_valid),callbacks=[DC],verbose=2)
print(self.params,"epochs : ",DC.deltas.index(min(DC.deltas)))
print(self.params,"deltamin : ",DC.deltas[DC.deltas.index(min(DC.deltas))])
print(self.params,"Nval : ", DC.Nvals[DC.deltas.index(min(DC.deltas))])
parameters_list=[[0,0.1],[0.1,0],[0.2,0],[0.1,0.2],[0.2,0.1],[0.3,0],[0.3,0.1],[0.3,0.2],[0,0.3],[0.1,0.3],[0.2,0.3]]
# create threads
THREADS = [FitModel(parameters) for parameters in parameters_list]
# start threads
for thread in THREADS:
thread.start()
# wait for threads to finish
for thread in THREADS:
thread.join()
字符串
问题是,当我尝试执行这段代码时,会出现多个错误,以及OOM错误。
1条答案
按热度按时间qij5mzcb1#
我知道这是一个老问题,但我仍然会回答,以防别人可能需要答案。
有两种方法。第一种是使用keras_tuner Hypermodel进行超参数调优。
https://keras.io/guides/keras_tuner/getting_started/
我不太熟悉这个,但我知道有一些方法可以为keras_tuner使用多线程。如果你使用随机搜索,网格搜索或hyperband,你可以做参数搜索。
我更熟悉scikit-learn估计器。既然你已经用run实现了一个类,你可以修改它来适应。然后你可以使用baseEstimator
https://scikit-learn.org/stable/developers/develop.html的
我相信keras有自己的预测函数,但它使用evaluate来评分。所以我认为你必须为你的类实现自己的评分函数,只需要在你的拟合模型上调用evaluate。然后你可以使用Scikit-Learn中的RandomSearchCV或GridSearchCV,并使用n_jobs来设置你想要的线程数。
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html的
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html的