Обученная нейронная сеть выдает разные прогнозы с одинаковыми данными (TensorFlow) - PullRequest
0 голосов
/ 05 июня 2018

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

Некоторая информационная прямая сеть
4 скрытых слоя с 900 нейронами в каждом
5000 тренировочных эпох
достигнута точность ~ 80%
данные были нормализованы с использованием нормализации от sklearn.предварительная обработка
функция стоимости: tenorflow.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 ]

0 голосов
/ 18 июня 2018

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

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

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

0 голосов
/ 11 июня 2018

Итак, я провел некоторое тестирование и выяснил следующее об этой проблеме.Поскольку я пытался повторно использовать мою созданную модель, мне пришлось использовать 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 output

def 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
            save

def 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...