Какая разница статической компьютерной графики в tensorflow и динамической компьютерной графики в Pytorch?

когда я изучал tensorflow, одной из основных концепций tensorflow были вычислительные графики, и графики считались статическими. И я нашел в Pytorch, что графики были динамическими. Какая разница статической компьютерной графики в tensorflow и динамической компьютерной графики в Pytorch?

3 ответов


обе структуры работают на тензорах и рассматривают любую модель как направленный ациклический граф (DAG), но они резко отличаются от того, как вы можете их определить.

TensorFlow следует за идиомой "данные как код и код-это данные". В TensorFlow вы статически определить график перед модель может работать. Вся связь с внешним миром осуществляется через ТФ.Объект сеанса и tf.Заполнитель, который является тензорами, которые будут заменены внешними данными во время выполнения.

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

однако эти подходы отличаются не только с точки зрения программной инженерии: существует несколько динамических нейросетевых архитектур, которые могут извлечь выгоду из динамического подхода. Напомним, RNNs: со статическими графиками длина входной последовательности останется постоянной. Это означает, что если вы разрабатываете модель анализа настроений для английских предложений, вы должны зафиксировать длину предложения до некоторого максимального значения и заполнить все меньшие последовательности нулями. Не слишком удобно, да. И вы получите больше проблем в области рекурсивных RNNs и tree-RNNs. В настоящее время Tensorflow имеет ограниченную поддержку динамических входов через TensorFlow Fold. PyTorch имеет его по умолчанию.

ссылки:

https://medium.com/towards-data-science/pytorch-vs-tensorflow-spotting-the-difference-25c75777377b

https://www.reddit.com/r/MachineLearning/comments/5w3q74/d_so_pytorch_vs_tensorflow_whats_the_verdict_on/


и TensorFlow, и PyTorch позволяют указывать новые вычисления в любой момент времени. Однако TensorFlow имеет шаги "компиляции", которые вызывают штраф производительности при каждом изменении графика. Таким образом, оптимальная производительность TensorFlow достигается, когда вы указываете вычисление один раз, а затем пропускаете новые данные через ту же последовательность вычислений.

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

чтобы сделать вещи конкретными, при изменении графика в TensorFlow (путем добавления новых вычислений с использованием обычного API или удаления некоторых вычислений с помощью tf.ВНО.graph_editor), эта строка запускается вsession.py. Он сериализует график, а затем базовая среда выполнения перезапустит некоторые оптимизации, которые могут занять дополнительное время, возможно, 200usec. Напротив, запуск op в ранее определенном графике или в numpy/PyTorch может быть как низко как 1 usec.


в tensorflow вы первый должны определить график, а затем выполнить его. После определения граф неизменен: вы не можете добавлять/удалять узлы во время выполнения.

в pytorch вместо этого вы можете изменить структуру графика во время выполнения: таким образом, вы можете добавлять/удалять узлы во время выполнения, динамически изменяя его структуру.