Можно ли использовать многопоточность для настройки гиперпараметров с помощью keras? - PullRequest
1 голос
/ 04 августа 2020

Поскольку настройка гиперпараметров, похоже, заключается в обучении разных моделей для одной и той же задачи, я полагаю, что было бы неплохо обучать их параллельно, чтобы выиграть время. Однако моя попытка оказалась совершенно неудачной, так как во время выполнения моего кода произошло несколько ошибок. Мне было интересно, требует ли использование keras, чтобы я писал многопоточность по-другому, или проблема в другом.

Вот что я написал (я пытаюсь вычислить влияние выпадения на минимальное значение настраиваемой метрики c):

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. Есть идеи, как это сделать?

...