Тензорный поток не является детерминированным, где он должен
У меня небольшая сеть. Обучены [много часов] и сохранены на контрольно-пропускном пункте. Теперь я хочу восстановить с контрольной точки другим скриптом и использовать его. Я воссоздаю сессию: создаю всю сеть, и все операции создаются заново, используя тот же код, который я делал до тренировки. Этот код устанавливает случайное начальное число для TF, используя time.time () [который отличается при каждом запуске].
Затем я восстановлю с контрольной точки. Я запускаю сеть и получаю разные цифры [небольшие, но значимые различия] каждый раз, когда запускаю восстановленную сеть. Важно отметить, что ввод является фиксированным. Если я фиксирую случайное начальное число на некотором значении, недетерминированное поведение исчезает.
Я озадачен, потому что я думал, что восстановление [никакие переменные не были даны для сохранения, поэтому я предполагаю, что весь граф был отмечен контрольными точками] устраняет все случайное поведение из этого потока. Инициализация и т. Д. Отменяются восстановленной контрольной точкой, это только предварительный прогон.
Это возможно? имеет смысл? Есть ли способ узнать, какие переменные или факторы в моем графике не установлены восстановленной контрольной точкой?
1 ответ
Кажется, что на этот вопрос уже был дан ответ в комментариях, но никто еще не записал ответ в явном виде, так что вот оно:
Вы ожидали, что граф вычислений будет всегда возвращать одни и те же значения, даже с разными случайными начальными числами, потому что вы думали, что в вашем графе не должно быть никаких операций, которые зависят от случайного начального числа.
Вы забыли о выбывшем.
В любом случае, я бы все равно оставил случайное начальное число фиксированным. Кроме того, этот и любые другие случайные операции являются детерминированными, и все ваше обучение может быть таким же. Если вы в какой-то момент задаетесь вопросом, сколько различий вы получаете от разных случайных семян, вы можете явно попробовать другие случайные семена.