Плохой код выхода при управлении несколькими сеансами

У меня странная проблема при обучении моделей с использованием tf.Graph и tf.Session. И реализация несколько странная, так что потерпите меня. Хочу пояснить структуру приложения.


Наконец, проблема заключалась (и несколько досадно) в решено путем обновления всех пакетов.


заявка

Приложение представляет собой сервис для работы с несколькими нейронными сетями: их обучения и прогнозирования на их основе. По этой причине одного графика было недостаточно. Поэтому при создании новой модели я сначала инициализирую как Graph, так и Session следующим образом:

def __init__(self):
    self.graph = tf.Graph()
    with self.graph.as_default():
        self.session = tf.Session()

Затем они используются как в процессе обучения, так и при загрузке модели с диска.

def fit(self, x_train, y_train, n=200, batch=256):
    with self.graph.as_default():
        with self.session.as_default():
            self.model.fit(x_train, y_train, epochs=n, batch_size=batch, verbose=0)

Вот где возникает проблема (мне удалось прокомментировать все по одному, и метод соответствия находится там, где он находится), но для дальнейшего контекста вот также (урезанный) метод создания. Он использует Керас.

def create(self):
    with self.graph.as_default():
        with self.session.as_default():
            self.model = Sequential()
            self.model.add(Dense(64, input_dim=shape[0], activation='relu',
                                 kernel_regularizer=reg.l1_l2(0.1, 0.2)))
            self.model.add(Dropout(0.5))
            self.model.add(Dense(1, activation='sigmoid', kernel_regularizer=reg.l1_l2(0.1, 0.2)))
            self.model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

Проблема

При инициализации сети и заполнении ее данными процесс завершается с неверным кодом: 0xC0000005. Это не дает много информации о самой проблеме, и плохой код выхода выдается сразу после выхода. Даже оператор print выполняется после успешного выполнения подпрограмм. Это заставило меня подозревать, что проблема не в реализации, а в чем-то другом.

Среда

Я использую Python 3.6.5 в PyCharm, но проблема возникает даже при выполнении из командной строки. Как я уже сказал, манипулируют несколькими моделями, но одного обучения достаточно, чтобы потерпеть крах.


Что могло быть здесь виновато? Я понимаю, что это не такая воспроизводимая проблема, но мы будем очень благодарны за любые указания даже на отладку.


Приключения

Я попытался изменить функцию fit в соответствии с этот ответ, но безуспешно. Вот модифицированная версия:

from keras import backend as K
import gc

def fit(self, x_train, y_train, n=20, batch=256):
    K.set_session(self.session)
    with self.graph.as_default():
        with self.session.as_default():
            self.model.fit(x_train, y_train, epochs=n*10, batch_size=batch, verbose=0)
    K.clear_session()
    gc.collect()

Затем я попытался создать новый сеанс для каждого вычисления (tf.Session(graph=self.graph)). Это работало при использовании cg.collect(), но после обучения модели я не мог делать прогнозы с новой сессией. tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value dense_1/bias

Обновлять

В настоящее время (8 ноября) я освобождаю все возможные ресурсы перед созданием и при загрузке модели. Это привело к тому, что я могу создать модель один раз, но во второй раз (я делаю два обучающих прохода для независимой оценки модели) программа вылетает, как и раньше. Давайте попробуем новый вопрос, это выходит из-под контроля. Q v.2

Вы разместили свою процедуру training, но где код, который вы используете для передачи входных данных через вашу обученную модель, чтобы генерировать выходные данные, то есть прогнозы? Вы сохраняете модель как файл .pkl?

Dascienz 26.10.2018 15:38

@Dascienz Как я уже сказал, только вызова сначала create, а затем fit (хорошо, может быть, я не понял) достаточно, чтобы выдать ошибку. Метод прогнозирования - это тот же вложенный оператор with, что и model.predict. Я сохраняю модель, поскольку это структура json и файл весов .h5, но, опять же, это не влияет на эту ситуацию.

Felix 26.10.2018 16:05

Можете ли вы опубликовать снимок экрана с полным сообщением об ошибке, которое появляется в вашем интерфейсе?

Dascienz 26.10.2018 16:08

Кстати, ошибка отступа в вашей функции create - просто опечатка? Ваши два заявления with ...

Dascienz 26.10.2018 16:10

@Dascienz Да, это опечатка: D Но извините, я не могу достать код какое-то время, по крайней мере, на выходные. Но на самом деле ошибки не было, как я уже сказал, код выхода процесса был просто кодом ошибки, приведенным выше.

Felix 26.10.2018 20:44
2
5
165
0

Другие вопросы по теме