PyTorchのテンソル&データ型のチートシート:PyTorch入門PyTorchのデータやパラメーターなどは、独自の「テンソル」形式で取り扱う。テンソルはNumPyライクに取り扱えるので難しくはない。テンソルの基本的な操作方法と、テンソル内の値のデータ型について、すばやく内容を確認できるチートシート形式で紹介する。前回は、PyTorchの核となる部分の説明を行った。今回は、PyTorchの基礎部分といえる「テンソルとデータ型」をチートシート形式で確認する。本連載の第1回〜第3回までは続きものとなっている。全3回の大まかな流れは以下の通りである。テンソルとデータ型(5)データセットとデータローダー(DataLoader)(6)ディープニューラルネットのモデル定義(7)学習/最適化(オプティマイザ)(8)評価/精度検証このうち、(1)〜(3)は前回説明済みである。今回は、(4)を説明する。それではさっそく説明に入ろう。※脚注や図、コードリストの番号は前回からの続き番号としている(第1回〜第3回は、切り離さず、ひとまとまりの記事として読んでほしいため連続性を持たせている)。テンソルとデータ型PyTorchのテンソルについては、前回でも既に何度か登場しており、例えばリスト1-3ではtorch.tensor([0.8])というコードでテンソル(torch.Tensor値)を作成した。PyTorchでデータや数値を扱うには、このテンソル形式にする必要がある。いっても、この例で分かるように、Pythonの数値やリスト値をtorch.Tensor値に変換したり数値計算したりするのは、(数学計算ライブラリ「NumPy」に使い方が似せられているのもあって)難しくない。下記リンク先にある公式チュートリアルの内容も易しいので、これを見てつまずく人はほとんどいないと思われる。documentation」よってここでは、詳しい説明は公式チュートリアルに任せ、基本的に同じ内容をまとめた「テンソルを作成/変換する基本的なコードのチートシート」を示すだけにする。ポイントなどは、コードのコメントとして記載した。チートシートの内容で分からないところがあれば、上記の公式チュートリアルやAPIドキュメントの説明を参照してほしい(※英語のページではあるが、第1回の冒頭でも紹介したようにChromeの[日本語に翻訳]機能を使えば十分に日本語で読めるだろう)。チートシート「PyTorchのデータ型」まずは、テンソルの中に含める数値について紹介しよう。PyTorchには、(NumPyのように)独自のデータ型(torch.dtypes)がある(表4-1)。PyTorchのデータ型ただし、ここでいうデータ型とは「あるテンソルに含まれる全要素に共通の統一的なデータ型」であることに注意しよう。torch.floatの場合は、テンソル内の全要素の数値が「32bitの浮動小数点」として扱われるので注意してほしい。種類は豊富だが、基本的に32bitのtorch.floatかtorch.intしか使わない。注意が必要なのが、NumPyの浮動小数点の数値が(環境によっては)デフォルトで64bitになっているという点だ。そのため、NumPyの多次元配列値からPyTorchのテンソルに変換した際に、テンソルの中の数値がtorch.double型になってしまう。PyTorchのクラス内ではtorch.float型が前提となっているメソッドなどが多くあるため、このままではエラーになってしまう可能性が高い。よって、NumPyから変換したテンソルは、そのfloat()メソッドを呼び出してデータ型の変換を行う必要がある。チートシート「テンソルのデータ型の変換」』で示している。以下では、シンプルにテンソルの使い方だけを示すため、print(x)などの出力に関するコードは極力、省略した。3)というコードの後にprint(x)を追記してほしい。x.size()というコードは、print(x.size())のようにprint関数を適宜、自分で補ってほしい。テンソルの新規作成は、第1回で既に説明した「数値を直接指定する方法」の他、empty()/rand()/zeros()/ones()といったメソッドでも行える。既存のテンソルと同じデータ型やサイズのものを新規作成する方法も提供されている。チートシート「テンソルの新規作成」チートシート「テンソルのサイズ取得とサイズ変更」テンソルのサイズ取得やテンソルの次元数取得は、NumPy風に行えるので、NumPyユーザーにとっては楽である。テンソルのサイズ変更も簡単に行える。NumPy風の記述も可能。数学計算も、+などの演算子を使った四則演算の他、add()(足し算)やpow()(累乗)やmean()(平均)といったメソッドが用意されている。メソッド名は直感的な数学用語なので、特に迷うことはないだろう。operations」を探すとよい。「*_()」パターン。changes)が起こること」を意味する。アンダースコア(_)がない通常の計算の場合(例えばadd())は、計算元のテンソル内部は変更されずに、戻り値として「新たなテンソル」が取得できる仕様だ。チートシート「テンソルのインデクシング/スライシング」テンソルにインデックス指定でアクセスしたり、スライス機能でデータを抽出したりする方法は、PythonリストやNumPy多次元配列と同じである。「テンソルの要素値をPythonの数値に変換したい」という場面は非常に多いので、この機能はよく使うことになる。これには、(あまり直感的ではないが)テンソルのitem()メソッドを呼び出すだけである。「PyTorchのテンソルとNumPyの多次元配列値を相互に変換したい」というニーズはさらに多い。これも簡単で、(直感的な)<テンソル>.numpy()メソッドやtorch.from_numpy(<多次元配列値>)を呼び出すだけだ。「numpy()」を呼び出すだけ。NumPy多次元配列値、の変換&連携」なお注意点として(メリットともいえるが)、そうやって変換されたテンソル/多次元配列は同じメモリ位置を共有するため、片方の数値を変更すれば、もう片方に即座に反映することになる。先ほどの「データ型」で説明したように、NumPyの多次元配列からPyTorchのテンソルに変換した場合、float()メソッドを呼び出して「torch.float64」から「torch.float32」にデータ型を変換することが必要な場面は多い。チートシート「テンソルのデータ型の変換」なお、NumPyからPyTorchテンソルへの変換では、データ型は基本的に次のように変換される。torch.float32/torch.float」チートシート「テンソル演算でのGPU利用」PyTorchでは、テンソルの計算にGPU(CUDAデバイス環境)を手軽に適用できる。以上で、PyTorchの基礎部分「テンソルとデータ型」の確認が終わった。次回は、PyTorchによる基本的な実装方法と一連の流れを説明する。ここからが本連載のメインである。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。