[PYTHON] [PyTorch] Achten Sie auf verschiedene Arten von Vorgängen zwischen verschiedenen Versionen.

TL;DR In Fackel = <1.2.0 und Fackel => 1.4.0 war das Ergebnis der Operation vom Typ Schwimmer und vom Typ Fackel.int64 (Fackel) unterschiedlich.

In torch = <1.2.0 ist die Operation von (float type) und (torch.int64 type) = (torch.int64). In torch => 1.4.0 ist die Operation von (float type) und (torch.int64 type) = (torch.float32).

Wenn der Brenner = <1.2.0 ist, verschwinden die Informationen nach dem Dezimalpunkt von (Float-Typ) aus dem Berechnungsergebnis. Es ist wichtig, die Ausführungsumgebung zu vereinheitlichen oder die Umwandlung bei der Durchführung von Berechnungen zu berücksichtigen.

Einführung

Ich werde es zum ersten Mal auf Qiita veröffentlichen. Es ist A (Twitter).

Normalerweise benutze ich PyTorch, um Spaß am Aufbau von NN und am Lernen zu haben. Unter solchen Umständen bin ich auf dieses Problem gestoßen, als ich numerische Berechnungen zwischen verschiedenen Versionen von PyTorch durchgeführt habe, daher werde ich es als Memo aufschreiben.

Wenn es Fehler gibt, würde ich mich freuen, wenn Sie in den Kommentaren darauf hinweisen könnten.

Hintergrund

Warum wechsle ich zwischen verschiedenen Versionen von PyTorch hin und her?

Aufgrund des Einflusses von Corona hat die Häufigkeit des Betretens des Labors abgenommen. Daher dachte ich, dass das Erstellen einer Umgebung mit einem Gaming-PC zu Hause die Forschung erleichtern würde. Deshalb habe ich die Umgebung wie folgt erstellt.

Als ich dann den Code ausführte, den ich zu Hause im Labor ausführte, funktionierte er normal, also dachte ich "Eh, eh, eh" und genoss mein Forschungsleben bequem.

Problem

Danach überprüfte ich die Codierungsarbeit und ob sie zu Hause ausgeführt werden konnte, und als ich NN im Labor lernte und verifizierte, bemerkte ich, dass zwischen den beiden Umgebungen unterschiedliche Ergebnisse ausgegeben wurden. ..

Unten finden Sie eine Python-Befehlszeile, um das Problem zu reproduzieren.

Laborumgebung

>>> 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
>>>  

Häusliche Umgebung

>>> 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
>>>  

Wie Sie sehen können, ist der Datentyp des Operationsergebnisses "ans" in der Laborumgebung "torch.int64" und in der häuslichen Umgebung "torch.float32". Mit anderen Worten, in torch == 1.1.0 verschwanden die Informationen nach dem Dezimalpunkt von "float" in "ans".

Dieses Problem hängt wahrscheinlich von Problemen zwischen Brennerversionen ab. (Ich denke, dass Fackel == 1.5.0 das Problem löst, "Fackel.int64" zu werden. Danke PyTorch.)

Überprüfung

Nun, da ich erwartet hatte, dass es von Problemen zwischen den Taschenlampenversionen abhängt, Ich habe versucht zu überprüfen, wo sich diese Spezifikation von torch = = 1.1.0 auf 1.5.0 geändert hat.

Die verifizierte Umgebung ist wie folgt.

Die verifizierte Version lautet wie folgt.

(1.3.0 befand sich nicht im PyTorch-Archiv, daher habe ich es nicht überprüft.)

Fackel == 1.1.0 (Repost)

>>> 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
>>>      

Fackel == 1.5.0 (Repost)

>>> 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
>>>  

Aus dem Ergebnis geht hervor, dass sich die Spezifikationen von Fackel = = 1.4.0 geändert haben. Es hing auch von der Taschenlampenversion ab.

Wahrscheinlich Offizielle Dokumentation und pytorch 1.4 Release Information Sie können es unter /pytorch/pytorch/releases/tag/v1.4.0) sehen. (Ich konnte es nicht finden ...)

abschließend

Unter dem Titel "Verschiedene Arten von Operationen zwischen verschiedenen Versionen" haben wir uns auf Operationen vom Typ Float und Torch.int64 zwischen verschiedenen Versionen von Taschenlampen konzentriert und den Unterschied in den Ausgabeergebnissen überprüft.

Was ich sagen kann ist

ist.

Da ich CUDA 9.0 in meiner Laborumgebung installiert hatte, hatte ich den Kompromiss, Fackel = = 1.1.0 zu verwenden, was zu diesem Ergebnis führte. Bei dieser Gelegenheit haben wir Python, CUDA und Fackel aktualisiert, um die Laborumgebung an die häusliche Umgebung anzupassen.

Warum werfen Sie keinen weiteren Blick auf die Entwicklungsumgebung?

Recommended Posts

[PyTorch] Achten Sie auf verschiedene Arten von Vorgängen zwischen verschiedenen Versionen.
Zusammenfassung von Beispielen, die nicht rückwärts pyTorch sein können
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Verwenden wir verschiedene Versionen von SQLite3 aus Python3!
[Java] So wechseln Sie zwischen mehreren Java-Versionen