Предположим, я хочу протестировать модели с несколькими кератами для поиска гиперпараметров, и я хочу сделать это на одном компьютере.
Я использую тензор потока в качестве бэкэнда, и все модели представляют собой шаблонные нейронные сети.
Теперь фактическое обучение, вероятно, придется проводить последовательно, так как я не знаю, как виртуализировать GPU, но по крайней мере компиляция может быть распараллелена.
Нечто подобное может помочь:
def build_model(hyper_param_dict):
model = Sequential()
...
adding layers and such
...
model.compile(
optimizer=tf.train.AdamOptimizer(hyper_param_dict['learning_rate']),
loss=hyper_param_dict['loss'],
metrics=selected_metrics)
worker_pool = Pool(4)
models = worker_pool.map(build_model, param_dictionaries_list)
Проблема в том, что это не так.
Вызов метода карты приводит к исключению:
multiprocessing.pool.MaybeEncodingError: Error sending result: '[<tensorflow.python.keras.engine.sequential.Sequential object at 0x000001F87E929EB8>]'. Reason: 'NotImplementedError('numpy() is only available when eager execution is enabled.',)'
А переписывание кода для использования starmap()
, imap()
или map_async()
приводит к той же ошибке или ее небольшим изменениям.
Но мне трудно поверить, что такая простая и, возможно, необходимая функциональность будет заблокирована керасом.
Я что-то упустил? Как правильно это сделать?