Я обучил нейронную сеть, используя 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)