web-dev-qa-db-fra.com

Quelle est la différence entre les graphiques informatiques statiques dans tensorflow et les graphiques informatiques dynamiques dans Pytorch?

Lorsque j'apprenais tensorflow, un concept de base de tensorflow était les graphiques de calcul, et les graphiques étaient statiques. Et j'ai trouvé dans Pytorch que les graphiques étaient dynamiques. Quelle est la différence entre les graphiques de calcul statiques dans tensorflow et les graphiques de calcul dynamiques dans Pytorch?

17
user166974

Les deux frameworks fonctionnent sur des tenseurs et voient n'importe quel modèle comme un graphique acyclique dirigé (DAG), mais ils diffèrent radicalement sur la façon dont vous pouvez les définir.

TensorFlow suit l'idiome "data as code and code is data". Dans TensorFlow, vous définissez le graphique de manière statique avant de pouvoir exécuter un modèle. Toutes les communications avec le monde extérieur sont effectuées via l'objet tf.Session et tf.Placeholder qui sont des tenseurs qui seront remplacés par des données externes lors de l'exécution.

Dans PyTorch, les choses sont beaucoup plus impératives et dynamiques: vous pouvez définir, modifier et exécuter des nœuds au fur et à mesure, pas d'interfaces de session ou d'espaces réservés spéciaux. Dans l'ensemble, le cadre est plus étroitement intégré avec le langage Python et se sent plus natif la plupart du temps. Lorsque vous écrivez dans TensorFlow, vous avez parfois l'impression que votre modèle est derrière un mur de briques avec plusieurs petits trous pour de toute façon, cela ressemble plus ou moins à une question de goût.

Cependant, ces approches ne diffèrent pas seulement dans une perspective d'ingénierie logicielle: il existe plusieurs architectures de réseaux de neurones dynamiques qui peuvent bénéficier de l'approche dynamique. Rappel des RNN: avec les graphiques statiques, la longueur de la séquence d'entrée restera constante. Cela signifie que si vous développez un modèle d'analyse des sentiments pour les phrases en anglais, vous devez fixer la longueur de la phrase à une valeur maximale et remplir toutes les petites séquences avec des zéros. Pas trop pratique, hein. Et vous obtiendrez plus de problèmes dans le domaine des RNN récursifs et des RNN arborescents. Actuellement, Tensorflow a un support limité pour les entrées dynamiques via Tensorflow Fold. PyTorch l'a par défaut.

Référence:

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/

14
Tushar Gupta

TensorFlow et PyTorch permettent de spécifier de nouveaux calculs à tout moment. Cependant, TensorFlow a une étape de "compilation" qui entraîne une baisse des performances à chaque fois que vous modifiez le graphique. Ainsi, les performances optimales de TensorFlow sont atteintes lorsque vous spécifiez le calcul une fois, puis transférez de nouvelles données à travers la même séquence de calculs.

C'est similaire aux interprètes et aux compilateurs - l'étape de compilation accélère les choses, mais décourage également les gens de modifier le programme trop souvent.

Pour concrétiser les choses, lorsque vous modifiez le graphique dans TensorFlow (en ajoutant de nouveaux calculs à l'aide de l'API standard ou en supprimant certains calculs à l'aide de tf.contrib.graph_editor), cette ligne est déclenchée dans session.py . Il sérialisera le graphique, puis le runtime sous-jacent réexécutera certaines optimisations qui peuvent prendre plus de temps, peut-être 200usec. En revanche, l'exécution d'une opération dans un graphique précédemment défini ou dans numpy/PyTorch peut être aussi faible que 1 usec.

7
Yaroslav Bulatov

Dans tensorflow vous d'abord devez définir le graphe, puis vous l'exécutez. Une fois défini, votre graphique est immuable: vous ne pouvez pas ajouter/supprimer de nœuds lors de l'exécution.

Dans pytorch, au lieu de cela, vous pouvez changer la structure du graphique au moment de l'exécution: vous pouvez donc ajouter/supprimer des nœuds au moment de l'exécution, en changeant dynamiquement sa structure.

1
nessuno