まったりAI勉強記

AI(人工知能)について、特にゆかりがあるわけでもない社会人が、まったりとAIについて勉強していく勉強日記です。

【ひとり読書会】PyTorch&深層学習プログラミング(第10回)

どうも、カタミチです。

さて、今日も「最短コースでわかる PyTorch&深層学習プログラミング」のひとり読書会、やっていきますかねー。

今日から2章ですね。「PyTorchの基本機能」です。1章はPythonの機能の解説でしたが、本章ではPyTorch固有の機能で重要なものを見ていくようです。ちなみにPyTorchについて簡単に調べてみたんですが、どうやら、Torchってやつを基にしてFacebook社(当時)によって開発が始まったオープンソースのライブラリ…とのことです、ふむふむ。

さぁ、行きますかね。

きたれ…三蔵法師!(他力本願)

2-1. 本章で学ぶ重要概念

この節は、本章に書かれていることの概要を説明した節ですね。ざっとページをめくってみましたが、ページ数的には2-2節の「テンソル」が一番ボリュームがありそうです。2-3〜2-5節はある程度つながっているようで、自動微分機能の説明から実際の微分の様子を見る…という流れのようですね。

 

2-2. テンソル

ということで入っていきましょう。2節は「テンソル」ですね。冒頭に、PyTorchでは、演算対象のデータはすべてテンソル(Tensor)というPyTorch固有の形式になっているとありました。前提として頭に入れておいたほうがよさそうですね。一般用語の「テンソル」もあるようですが、本書では「テンソル」といえばPyTorchのクラス名称を指すことにする、とのことです。一般用語のテンソルには色々な意味があるようですが、機械学習で扱うテンソルは多次元配列を意味するようですね。

さて、まずはPyTorchのライブラリのインポートからです。

こんな風に書くようです…

どん!

うん、シンプルですね。ライブラリ名が短いためか、いつもの「as なんちゃら」って別名定義をしてないですね。

さて、テンソルを作っていきましょう。どうやら、テンソルでは階数が重要な意味を持つみたいですね。これまでに知った言葉に置き換えると…

0階テンソル:スカラー
1階テンソル:ベクトル
2階テンソル:行列
3階テンソル以降:別名無し

ってことみたいです。NumPyも行列を扱うのがうまかったですが、PyTorchはそれが高次元になってもうまく扱える…ってことなんですかね。先まで見ていけばきっと分かるでしょう。

とりあえずコード書いてみましょう。

まずは0階テンソルであるスカラーの例です。「tensor」って関数でテンソル変数を作るみたいですね。「dtype」で変数の型を調べていますが、「torch.float32」となっています。これについては「.float()」がミソらしいです。これを付けないと、型が「torch.float64」になって、他のライブラリで使うのに都合が悪いようです。

ちなみに、torch.tensorの引数の「1.0」を「1」にして実行してみても、特に問題なく動作しました。あえて「1.0」と書くのは、お作法的な感じですかね(ふむ)

さて、変数r0の中身を見てみましょう。

テンソルにもshape関数があるってことと、data関数でデータの中身が引っ張れるってことがここで分かりますね。

次に1階テンソル、つまりベクトルの例です。

NumPyのndarrayをそのまま突っ込めるようですね。shape関数の結果サイズが[5]になってますし、data関数の結果に配列が入ってますね。

ちなみに、NumPyのndarrayじゃなくてPython標準のリストを突っ込んでみると…同じように格納できました。ふむふむ。

だいたい雰囲気は掴めましたね。次は2階テンソル、つまり行列ですね。

はい、2行3列の行列がしっかり格納されました。

次に3階テンソル。ここまで来ると別名はありません。テンソルとしか言いようのないものですね。まぁ、同じようにNumPyの3次元配列を突っ込む感じでしょう。

…違いました(汗)

torchのrandn関数で配列を乱数で生成してそのまま変数に格納しているようですね。seedを指定して乱数を固定してますね。ちなみにrandnは、正規分布乱数ってやつですね。「He Normal」の勉強した時に出てきたやつです(【ひとり読書会】ディープラーニングの数学(第33回) - まったりAI勉強記)。正規分布乱数を生成する関数はNumPyに装備されていると聞いていましたが、PyTorchも装備しているんですね(ふむ)

特に型変換の処理をしていないところを見ると、生成されるのはfloat32ってことなのかな?と疑問に思ってdtypeを見てみたところ…

float32でした(納得)

しかし、多次元配列になってもdtypeでひとつの値が返ってくるということは、逆に言うとテンソルデータのすべての要素は同じ型(float32)で定義されてるってことになりますかね。

さて、ダメ押しです。一応4階テンソルも見てみると…

同じですね。

今回、ones関数を使っていますね。こいつもNumPyの関数にあったやつで、「1」で埋め尽くされた配列を生成するやつですね。これまで見てきたこの感じ…PyTorchはNumPyをラップしてるんですかねー。

それにしても、4階テンソルまで来るとデータ見ても空間的な把握ができなくなりますね。

 

ということで

「テンソル」の節は途中ですが、長くなってきたので、いったんここまでにしておきますかねー。

ではまた。