Можно ли обучать модели keras на многих тренировочных комплексах многопроцессорным способом? - PullRequest
0 голосов
/ 19 января 2019

Я запускаю python v = 3.6.7 с PyCharm, используя виртуальную среду conda. Моя версия tenorflow - 1.12.0. Я хочу тренировать много моделей керас на различных тренировочных комплексах. Поскольку обучение на одном отдельном обучающем наборе уже довольно медленное, я хотел бы запустить цикл for, используя функцию пула многопроцессорной библиотеки. Ниже приведен минимальный пример, воспроизводящий проблему.

fit_model - это функция, на которой я хочу запустить многопроцессорность: она принимает в качестве входного значения массив numpy, который представляет собой обучающий набор, и обучает на нем простую нейронную сеть keras (фиктивные настройки). Я уже читал, что одним важным аспектом при выполнении многопроцессорной обработки с тензорным потоком является обеспечение того, чтобы функция, которую мы хотим многопроцессорным способом, имела импорт тензорного потока сверху, что я и сделал. Если я добавлю следующую инструкцию (ниже «нормального» импорта)

    import tensorflow as tf
    tf.enable_eager_execution()

поверх функции fit_model, у меня есть сообщение об ошибке (усечено):

    ValueError: optimizer must be an instance of tf.train.Optimizer, not a <class 'str'>

Без инструкции «enable_eager_execution» я получаю следующее:

    multiprocessing.pool.MaybeEncodingError: Error sending result: 
    '[<tensorflow.python.keras.engine.sequential.Sequential object at 0x00000184FFBAC630>]'. Reason: 'NotImplementedError('numpy() is only available when eager execution is enabled.',)'

Пожалуйста, смотрите ниже мой код. Вы можете добавить несколько пустых обучающих наборов, представленных ниже: просто перетащите данные в txt-файлы 'ts1.txt', 'ts2.txt', 'ts3.txt' и сохраните их там, где вы запускаете код.

Учебный комплект 1:

    0.041495488 0.297990987 0.724621927 6.129053462
    0.953892097 0.308757758 0.469787044 5.969195238
    0.337488    0.49381137  0.906903059 13.21446917
    0.654812999 0.64815423  0.444301154 9.372944825
    0.119398718 0.152801516 0.59553224  2.786747848
    0.811252373 0.496546    0.899673501 14.13092453
    0.255991654 0.1058905   0.595081192 2.276359761
    0.715703318 0.391053934 0.077776996 2.283026639
    0.404416543 0.348081104 0.439224169 5.08963083
    0.076034482 0.285709566 0.43068089  3.597459163

Учебный комплект 2:

    0.351528844 0.866463242 0.083273802 2.723360975
    0.689580826 0.875736673 0.783812364 20.59873213
    0.756136259 0.717057395 0.455913086 10.66591631
    0.133306324 0.418013101 0.023300008 0.539324484
    0.948773896 0.253098491 0.455538012 5.125835331
    0.41842445  0.518841476 0.475774703 7.74869507
    0.535329652 0.548263348 0.37085254  6.763755249
    0.665158688 0.501906321 0.031474934 1.772646491
    0.30009976  0.649788342 0.685829413 13.07823033
    0.15021059  0.806372521 0.853050268 19.56095746

Учебный комплект 3:

    0.990594623 0.229487172 0.28671828  3.823537929
    0.941261097 0.87953271  0.384903849 11.3615169
    0.260536935 0.889700723 0.456944222 11.90429481
    0.543933952 0.683776861 0.269533461 6.248288724
    0.287850026 0.464306966 0.698678531 9.658936707
    0.260487811 0.569814545 0.050767667 1.33096397
    0.836448581 0.642146809 0.350982713 7.98360518
    0.437645129 0.87036494  0.638338969 16.4317503
    0.88084079  0.943387589 0.564804696 16.6809143
    0.859626262 0.453784697 0.951882406 13.81384327

Код:

from multiprocessing import Pool
import numpy

def fit_model(dataset):
        from tensorflow.python.keras.models import Sequential
        from tensorflow.python.keras.layers import Dense
        #import tensorflow as tf
        #tf.enable_eager_execution()
        x = dataset[:, 0:3]
        y = dataset[:, 3]
        model = Sequential()
        model.add(Dense(3, input_dim=3, activation='relu'))
        model.add(Dense(3, activation = 'relu'))
        model.add(Dense(1, activation = 'linear'))
        model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
        model.fit(x, y, epochs=3)
        return model

if __name__ == "__main__":
        dataset1 = numpy.loadtxt('ts1.txt')
        dataset2 = numpy.loadtxt('ts2.txt')
        dataset3 = numpy.loadtxt('ts3.txt')
        datasets = [dataset1, dataset2, dataset3]

        p = Pool()
        models_mp = p.map(fit_model, datasets)
        p.close()
        p.join()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...