Нейронная сеть Tensorflow предсказывает различные значения после восстановления - PullRequest
0 голосов
/ 17 сентября 2018

Я обучил нейронную сеть, используя TensorFlow 1.8.0 и нетерпеливое выполнение. После тренировки я сохранил его, и не было проблем с загрузкой и прогнозированием, когда я делал это только в cmd. Затем я сделал Python-сервер (используя колбу), который загружает обученную модель для получения запросов POST с данными в формате json, который впоследствии стандартизируется и переходит к модели. Но затем каждый раз, когда я перезагружал сервер, нейронная сеть давала разные ответы с разными вероятностями. Некоторые веса были каким-то образом инициализированы случайным образом, но проблема в том, что когда я не использовал сервер, все работает как надо.

Мне предложили использовать:

tf.set_random_seed(1234)

Это помогло со случайными ответами, но прогнозы из сети отличались от тех, которые я получил, когда обучал его. Я изменил целые числа в tf.set_random_seed и каждый раз получал разные результаты, поэтому я предполагаю, что мне просто нужно дать правильный аргумент для tf.set_random_seed, и сеть будет работать так, как я ее обучил.

Так откуда мне знать, что именно писать в tf.set_random_seed или он работает совершенно иначе, чем я понял? Или есть проблема с чем-то еще?

Код выглядит так:

imports
tf.enable_eager_execution()

tf.set_random_seed(5)
model = tf.keras.Sequential([
...
])
optimizer
root = tfe.Checkpoint(optimizer=optimizer, model=model, 
optimizer_step=tf.train.get_or_create_global_step())    
root.restore(tf.train.latest_checkpoint(checkpoint_directory))

@app.route('/calc', methods=['POST'])
def predict_data():
    read and parse json
    class_ids = ["false", "true"]
    predict_data = tf.convert_to_tensor([data_to_predict])
    predictions = model(predict_data)
    for i, logits in enumerate(predictions):
        class_idx = tf.argmax(logits).numpy()
        p = tf.nn.softmax(logits)[class_idx]
        name = class_ids[class_idx]
        return("{\"Result\":"+ name+",\"Probability\":"+str(float(p))+"}")

if __name__ == '__main__':
app.run(debug, port)

1 Ответ

0 голосов
/ 17 сентября 2018

Проверьте буфер протокола для тензорного потока.

Также сделайте ваши тренировки тензорного потока и Eager Execution связанными с tf.Session (), что сделает график уже сохраненной модели сохраненным в классе Session.

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