Я обучил нейронную сеть 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)
Итак, я провел некоторое тестирование и выяснил следующее об этой проблеме. Поскольку я пытался повторно использовать мою созданную модель, мне пришлось использовать tf.global_variables_initializer (). При этом он перезаписал мой импортированный график, и все значения были случайными, что объясняет разные сетевые выходы. Это все равно оставило меня с проблемой решить: как я загружаю свою сеть? Обходной путь, который я использую в настоящее время, пока не оптимален, но он по крайней мере позволяет мне использовать мою сохраненную модель. Тензорный поток позволяет дать уникальные имена используемым функциям и тензорам. Поступая таким образом, я мог получить к ним доступ через график:
Используя этот метод, я мог получить доступ ко всем моим сохраненным значениям, но они были разделены! Это означает, что у меня было 1x вес и 1x смещение за операцию, что привело к появлению новых переменных. Если вы не знаете имена, используйте следующее:
Это печатает имена коллекций (наши переменные хранятся в коллекциях)
Это позволяет нам получить доступ к коллекции, как посмотреть, какие имена / ключи для наших переменных.
Это привело к другой проблеме. Я больше не мог использовать свою модель, поскольку в качестве инициализатора глобальных переменных все было перезаписано. Таким образом, мне пришлось переопределить всю модель вручную с весом и предубеждениями, которые я получил ранее.
К сожалению, это единственное, что я мог придумать. Если у кого-то есть лучшая идея, сообщите мне.
Все это с ошибкой выглядело так:
Итак, это действительно глупая ошибка. Теперь он отлично работает с загрузкой модели из сохранения. Проблема была вызвана инициализатором глобальных переменных. Если вы оставите его, он будет работать нормально. Ранее найденная информация может оказаться полезной для кого-то, поэтому я оставлю ее здесь. Решение теперь:
После этого вы можете продолжать, как обычно. Я не знаю, почему инициализатор переменных мешает этому работать. Как я вижу, это должно быть что-то вроде: инициализировать все переменные для существования и со случайными значениями, а затем добраться до этого сохраненного файла и использовать значения оттуда, но, видимо, что-то еще происходит ...