有没有可能使用多线程对keras进行超参数调优?

yws3nbqq  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(130)

由于超参数调优似乎是为了同一个任务训练不同的模型,我想并行训练它们是一个好主意,以获得一些时间。然而,我的尝试非常不成功,因为在执行代码时出现了多个错误。我想知道使用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错误。

qij5mzcb

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

相关问题