Я столкнулся с некоторой проблемой при запуске скрипта python в экземпляре облачных вычислений Google с python 3.6, tensorflow 1.13.1. Я вижу, что несколько человек сталкиваются с похожими проблемами циклов в вычислительном графе в stackoverflow. Но никто из них на самом деле не находит виновного в этом. И я наблюдаю что-то интересное, так что, может быть, кто-то из опытных сможет это понять.
Сообщение об ошибке выглядит следующим образом:
2019-05-28 22:28:57.747339: E tensorflow/core/grappler/optimizers/dependency_optimizer.cc:704] Iteration = 0, topological sort failed with message: The graph couldn't be sorted in topological order.
2019-05-28 22:28:57.754195: E tensorflow/core/grappler/optimizers/dependency_optimizer.cc:704] Iteration = 1, topological sort failed with message: The graph couldn't be sorted in topological order.
Мой скрипт для train.py будет выглядеть так:
import A,B,C
...
def main():
....
if __name__ == '__main__':
main()
Итак, я покажу два способа запуска этого скрипта:
ВЕРСИЯ 1:
В терминале
python3 train.py
Это дает мне ошибку, как я указал выше. Когда я использую только процессор, я замечаю, что он выдает что-то вроде failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
. Поэтому я добавляю GPU в свой экземпляр, но петля в вычислительном графе все еще существует.
ВЕРСИЯ 2 (Здесь происходят странные вещи):
Я просто копирую, ничего не меняя, код из main
в блокнот jupyter и запускаю там. Затем внезапно ошибка больше не возникает.
Я действительно не знаю, что происходит под капотом. Я просто заметил, что сообщение в начале выполнения не совпадает между двумя разными способами запуска кода.
Если вы столкнулись с той же проблемой, копирование в блокнот Jupyter может помочь напрямую. Я бы очень хотел поделиться дополнительной информацией, если у кого-то есть идеи, что может быть причиной этого. Спасибо!
Ну получается, несмотря ни на что, я выбрал неправильный способ построения графика в начале, который не даст loop
с моей точки зрения. loop error
подсказывает, что я делаю что-то не так. Но на интересный вопрос, о котором я упоминал выше, до сих пор нет ответа! Тем не менее, я хотел бы поделиться своей ошибкой, чтобы любой, кто увидит loop error
, подумал, делаете ли вы то же самое, что и я.
В input_fn
я использую tensor.eval()
, чтобы получить соответствующий numpy.array
в середине для взаимодействия с данными вне этой функции. Я предпочитаю не использовать tf.data.Dataset
, потому что весь процесс сложен, и я не могу напрямую сжать все это в Dataset
. Но оказывается, что этот подход саботирует дизайн статического вычислительного графа Tensorflow. Таким образом, во время обучения он снова и снова тренируется на одной и той же партии. Итак, мой двухцентовый совет: если вы хотите добиться чего-то сверхсложного в своем input_fn
. Скорее всего, вам будет лучше или даже лучше, если вы будете использовать старомодный способ моделирования — tf.placeholder
.