Я запускаю 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()
Приведенный выше код не работает, и я начинаю задумываться, возможно ли мне то, что я пытаюсь сделать.