Обученная нейронная сеть производит разные прогнозы с одинаковыми данными (TensorFlow)

Apolonius спросил: 12 мая 2018 в 04:45 в: python

Я обучил нейронную сеть TensorFlow. После обучения я сохранил его и снова загрузил в новый ". py ', чтобы избежать переобучения при несчастном случае. Поскольку я тестировал его с некоторыми дополнительными данными, я узнал, что он предсказывает разные вещи для одних и тех же данных. Если он теоретически не вычисляет одно и то же для одних и тех же данных?

Некоторая информация возвращает прямую сеть 4 скрытых слоя с 900 нейронами каждый
5000 учебных эпох
достигнута точность ~ 80% данные были нормализованы с использованием нормализации из sklearn. preprocessing
функция стоимости: tensorflow.nn.softmax_cross_entropy_with_logits Оптимизатор: tf.train.AdamOptimizer
Я передаю свою сеть данные в виде матрицы, так же, как я использовал для обучения. (каждая строка содержит образец данных, имеющий столько столбцов, что есть входные нейроны).

Из десяти циклов прогнозирования с теми же данными моя сеть производит разные результаты, по крайней мере, в течение 2 циклов (максимальный наблюдаемый 4 до сих пор )Как это может быть. По теории все, что происходит, - это вычисления обработки данных вида W_i x_i + b_i. Поскольку мои x_i, W_i и b_i больше не меняются, как получается, что предсказание меняется? Может ли быть ошибка в процедуре перезагрузки модели?

with tf.Session() as sess:  
    saver = tf.train.import_meta_graph('path to .meta')  
    saver.restore(sess, tf.train.latest_checkpoint('path to checkpoints'))  
    result = (sess.run(tf.argmax(prediction.eval(feed_dict=x:input_data}),1)))  
    print(result)  

2 ответа

Apolonius ответил: 18 мая 2018 в 07:01

Итак, я провел некоторое тестирование и выяснил следующее об этой проблеме. Поскольку я пытался повторно использовать мою созданную модель, мне пришлось использовать tf.global_variables_initializer (). При этом он перезаписал мой импортированный график, и все значения были случайными, что объясняет разные сетевые выходы. Это все равно оставило меня с проблемой решить: как я загружаю свою сеть? Обходной путь, который я использую в настоящее время, пока не оптимален, но он по крайней мере позволяет мне использовать мою сохраненную модель. Тензорный поток позволяет дать уникальные имена используемым функциям и тензорам. Поступая таким образом, я мог получить к ним доступ через график:

with tf.Session() as sess:
    saver = tf.train.import_meta_graph('path to .meta')  
    saver.restore(sess, tf.train.latest_checkpoint('path to checkpoints'))
    graph = tf.get_default_graph()
    graph.get_tensor_by_name('name:0')

Используя этот метод, я мог получить доступ ко всем моим сохраненным значениям, но они были разделены! Это означает, что у меня было 1x вес и 1x смещение за операцию, что привело к появлению новых переменных. Если вы не знаете имена, используйте следующее:

print(graph.get_all_collection_keys())

Это печатает имена коллекций (наши переменные хранятся в коллекциях)

print(graph.get_collection('name'))

Это позволяет нам получить доступ к коллекции, как посмотреть, какие имена / ключи для наших переменных.

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

К сожалению, это единственное, что я мог придумать. Если у кого-то есть лучшая идея, сообщите мне.

Все это с ошибкой выглядело так:

imports...
placeholders for data...def my_network(data):
    ## network definition with tf functions ##
return outputdef train_my_net():
    prediction = my_network(data)
    cost function
    optimizer
    with tf.Session() as sess:
        for i in how many epochs i want:
            training routine
            savedef use_my_net():
    prediction = my_network(data)
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        saver = tf.train.import_meta_graph('path to .meta')  
        saver.restore(sess, tf.train.latest_checkpoint('path to checkpoints'))
        print(sess.run(prediction.eval(feed_dict={placeholder:data})))
graph = tf.get_default_graph()
Есть решение
Apolonius ответил: 25 мая 2018 в 07:21

Итак, это действительно глупая ошибка. Теперь он отлично работает с загрузкой модели из сохранения. Проблема была вызвана инициализатором глобальных переменных. Если вы оставите его, он будет работать нормально. Ранее найденная информация может оказаться полезной для кого-то, поэтому я оставлю ее здесь. Решение теперь:

saver = tf.train.Saver()
with tf.Session() as sess:
    saver.restore(sess, 'path to your saved file C:x/y/z/model/model.ckpt')

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