どうも、カタミチです。
さて、今日も「最短コースでわかる PyTorch&深層学習プログラミング」のひとり読書会、やっていきますかねー。
今日から「基礎編」。1章の「ディープラーニングのためのPythonのツボ」に入っていきたいと思います!
1-1. 本書で学ぶ重要概念
この節は、以降の1-2から1-6にどんなことが書いてあるのかの説明の節でした。どうやら、PythonやPyTorchの特性として事前に理解しておいた方がいい事が、いくつか書かれているようですね。
ということで早速、1-2から見てみましょう!
1-2. コンテナデータ型の変数にご用心
さて、節のタイトルにある「コンテナデータ型」の変数ってなんじゃろ?って話なんですが、どうやらNumPyの配列データみたいなやつの型のことを、こう呼ぶことがあるようですね。
「コンテナ」って表現は色んなところで見かけますが、概念としては「中に何か入った箱」ですね。クレーンで船に積み込むデカいアイツです。今回は変数の型を指した用語として使うようなので、そのつもりで見てみましょうかね。
ちなみにNumPyの配列データに、データ型を調べるtype関数を使うと…
numpy.ndarray
って値が返ってきます。Python標準の配列は「list」という値が返ってくるので、別もの扱いですね。以前、なにかの時にちょっとつまずきました、ココ。
まぁしかし、今回の注意点はそんなとこではありません。とりあえずコード。
これを実行すると当然…
\(x\)も\(y\)も同じNumPy配列が返されます。そらそうだ。
ここで、\(x\)の中身のデータを少しいじって、
これを実行すると…
ぐはっ!\(y\)の中身まで変わりやがったっ!
この動き、25年ほど前に独学で「C言語」の勉強をしていたときの記憶が蘇りましたよ、ええ。「値渡し」と「参照渡し」の違いガーってやつです。\(y\)に渡された\(x\)は、値ではなく住所だったってことになります。
で、コンテナデータ型の値渡しをしたい場合は…
copy関数ってやつを使うみたいですね。これで\(x\)と\(y\)は、晴れて独立に存在するようになったようです。めでたしめでたし。
しかしこれ、今はここだけに注目しているからいいものの、コードの海に飛び込んだ際は、気を抜くと間違いに気づかなそうです。肝に銘じておかねば。ちなみに、PyTorchで扱うデータである「テンソル」(Tensor)からnumpy.ndarray型に変換する際も、同様の問題が起きるとのこと。ここでも、copy忍者のカカシ先生が有効なようなので、うまく使いこなしたいところです(誰だよカカシ先生って)。
ということで
今回のポイントは、コンテナデータ型の複製には注意が必要ってことですね。ひとまず頭に入れておく事にしますかねー。
ではまた。