[PYTHON] [PyTorch] Faites attention aux différents types d'opérations entre les différentes versions.

TL;DR Dans torch = <1.2.0 et torch => 1.4.0, le résultat du fonctionnement de type flotteur et de type torch.int64 (torch.sub) était différent.

Dans torch = <1.2.0, le fonctionnement de (type flotteur) et (type torch.int64) = (torch.int64). Dans torch => 1.4.0, le fonctionnement de (type flotteur) et (type torch.int64) = (torch.float32).

Lorsque torche = <1.2.0, les informations après la virgule décimale de (type flottant) disparaissent du résultat du calcul. Il est important d'unifier l'environnement d'exécution ou de prendre en compte la distribution lors de l'exécution des calculs.

introduction

Je le posterai sur Qiita pour la première fois. C'est A (twitter).

J'utilise généralement PyTorch pour aimer construire NN et étudier. Dans de telles circonstances, j'ai rencontré ce problème lors de l'exécution de calculs numériques entre différentes versions de PyTorch, je vais donc l'écrire sous forme de mémo.

S'il y a des erreurs, j'apprécierais que vous les signaliez dans les commentaires.

Contexte

En premier lieu, pourquoi dois-je faire des allers-retours entre les différentes versions de PyTorch?

En raison de l'influence de Corona, la fréquence d'entrée dans le laboratoire a diminué, j'ai donc pensé que la création d'un environnement avec un PC de jeu à la maison faciliterait la recherche, j'ai donc construit l'environnement comme suit.

Ensuite, quand j'ai exécuté le code que j'exécutais dans le laboratoire à la maison, cela fonctionnait normalement, alors j'ai pensé «Eh, eh, eh», et j'ai apprécié ma vie de recherche confortablement.

problème

Après cela, j'ai vérifié s'il pouvait être codé et exécuté à la maison, et lorsque j'apprenais et vérifiais NN en laboratoire, j'ai remarqué que des résultats différents étaient émis entre les deux environnements. ..

Vous trouverez ci-dessous une ligne de commande Python pour reproduire le problème.

Environnement de laboratoire

>>> import torch
>>> torch.__version__
'1.1.0'
>>> float = 3.14
>>> tensor_int = torch.tensor(3, dtype=torch.int64)
>>>
>>> type(float)
<class 'float'>
>>> tensor_int.dtype
torch.int64
>>>
>>> ans = torch.sub(float, tensor_int)
>>> ans
tensor(0)
>>>
>>> ans.dtype
torch.int64
>>>  

Environnement de la maison

>>> import torch
>>> torch.__version__
'1.5.0'
>>> float = 3.14
>>> tensor_int = torch.tensor(3, dtype=torch.int64)
>>>
>>> type(float)
<class 'float'>
>>> tensor_int.dtype
torch.int64
>>>
>>> ans = torch.sub(float, tensor_int)
>>> ans
tensor(0.1400)
>>>
>>> ans.dtype
torch.float32
>>>  

Comme vous pouvez le voir, le type de données du résultat de l'opération «ans» est «torch.int64» dans l'environnement de laboratoire et «torch.float32» dans l'environnement domestique. En d'autres termes, dans torch == 1.1.0, les informations après la virgule décimale de "float" disparaissaient dans "ans".

Ce problème dépend probablement des problèmes entre les versions de torche. (Je pense que torch == 1.5.0 résout le problème de devenir torch.int64. Merci PyTorch.)

Vérification

Maintenant que je m'attendais à ce que cela dépende des problèmes entre les versions de la torche, J'ai essayé de vérifier où cette spécification a changé de torche = = 1.1.0 à 1.5.0.

L'environnement vérifié est le suivant.

La version vérifiée est la suivante.

(1.3.0 n'était pas dans PyTorch Archive, donc je ne l'ai pas vérifié.)

torche == 1.1.0 (republication)

>>> import torch
>>> torch.__version__
'1.1.0'
>>> float = 3.14
>>> tensor_int = torch.tensor(3, dtype=torch.int64)
>>>
>>> ans = torch.sub(float, tensor_int)
>>> ans
tensor(0)
>>>
>>> ans.dtype
torch.int64
>>>  

torch==1.2.0

>>> import torch
>>> torch.__version__
'1.2.0'
>>> float = 3.14
>>> tensor_int = torch.tensor(3, dtype=torch.int64)
>>>
>>> ans = torch.sub(float, tensor_int)
>>> ans
tensor(0)
>>>
>>> ans.dtype
torch.int64
>>>  

torch==1.4.0

>>> import torch
>>> torch.__version__
'1.4.0'
>>> float = 3.14
>>> tensor_int = torch.tensor(3, dtype=torch.int64)
>>>
>>> ans = torch.sub(float, tensor_int)
>>> ans
tensor(0.1400)
>>>
>>> ans.dtype
torch.float32
>>>      

torche == 1.5.0 (republication)

>>> import torch
>>> torch.__version__
'1.5.0'
>>> float = 3.14
>>> tensor_int = torch.tensor(3, dtype=torch.int64)
>>>
>>> ans = torch.sub(float, tensor_int)
>>> ans
tensor(0.1400)
>>>
>>> ans.dtype
torch.float32
>>>  

D'après le résultat, il semble que les spécifications ont changé de torche = = 1.4.0. Cela dépendait également de la version de la torche.

Probablement Documentation officielle et pytorch 1.4 Release Information Vous pouvez le voir en lisant /pytorch/pytorch/releases/tag/v1.4.0). (Je n'ai pas pu le trouver ...)

en conclusion

Sous le titre «Différents types d'opérations entre différentes versions», nous nous sommes concentrés sur les opérations de type flotteur et de type torch.int64 entre différentes versions de torche et avons vérifié la différence des résultats de sortie.

Ce que je peux dire c'est

est.

Depuis que CUDA 9.0 était installé dans mon environnement de laboratoire, j'ai eu le compromis d'utiliser torch = = 1.1.0, ce qui a conduit à ce résultat. Profitant de cette opportunité, nous avons mis à niveau Python, CUDA et torche pour aligner l'environnement du laboratoire sur l'environnement domestique.

Pourquoi ne jetez-vous pas un autre regard sur l'environnement de développement?

Recommended Posts

[PyTorch] Faites attention aux différents types d'opérations entre les différentes versions.
Résumé des exemples qui ne peuvent pas être pyTorch à l'envers
La réponse de "1/2" est différente entre python2 et 3
Utilisons différentes versions de SQLite3 de Python3!
[Java] Comment basculer entre plusieurs versions de Java