読者です 読者をやめる 読者になる 読者になる

Coding Memos

try {coding} catch {questions}

NumPyとMatplotlib【ゼロ作DL_4】

Deep Learning ゼロ作DL Python3 学習ログ

Python3の外部ライブラリのNumPyについての学習ログです。

NumPy

NumはNumberなのかNumericなのか、定かではないですが、Numっていう3文字は数学に使われるライブラリって感じしますね。 ちょっと数学は随分昔にやったっきりなんで、頑張ります。

ディープラーニングの実装では、配列や行列の計算が多く登場します。

な、なるほど。行列って忘れてしまってますね。私の学生時代のカリキュラムでは、数学Cにあたる内容だったかな。

ひとまずNumPyの多次元配列の扱い方に関してインタプリタで確かめられるコード書いていきます。

一次元配列(ベクトル)

>>> import numpy as np
>>> x = np.array([1,2])
>>> y = np.array([5,9])
>>> print(x + y)
[ 6 11]

>>> print(x * 2)
[2 4]

import numpy as npっていう書き方自体は、PHPのnamespaceのあたりでも似たように書くので、個人的には違和感のない書き方です。

配列の算術はelement-wiseの結果(配列の要素ごとの算術結果)になるみたいですね。

一次元配列は、数学的にはベクトルだと思うんで、最後の二行で書いた、一次元配列に対して、スカラ倍(単一の数値で掛け算する。平たく言えば、一般的な「2」とか「5」とかそういう数値)すると、各要素に対してその操作を与えられるというのは、直感的なはなしになっていますね。

高校数学うろ覚えなので、所々、復習しないとならないですね。

二次元配列(行列)

>>> import numpy as np
>>> A = np.array([[1,2], [3,5]])
>>> B = np.array([[4,1], [4,6]])
>>> print(A + B)
[[ 5  3]
 [ 7 11]]

配列の中に配列を組み入れるという感じですね。どのような言語でも似たようにかけるんじゃないかなとおもいます。 スカラ倍したときの考え方は、一次元配列の際と同じで、NumPy的にはいずれもブロードキャストという機能です。

行列の数学的な扱い方、行列をプログラムで書くこと、これらがわかったとして、ディープラーニングを実装しようと なった時に、自分が行列を持ち出して、このように設計すればいいと考えることが多分一番難しそうです。

Matplotlib

グラフや画像を描画できる外部ライブラリ。

f:id:codingmemos:20170224023651p:plain

こんな感じで、描画できた。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 6, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, label='sin')
plt.plot(x, y2, linestyle='--', label='cos')
plt.xlabel('x')
plt.ylabel('y')
plt.title('sin & cos')
plt.legend()
plt.show()

これをスクリプトファイルでかいて、ターミナルで実行する

さらに普通の画像も次のようにスクリプトを書いてターミナルで実行する。

import matplotlib.pyplot as plt
from matplotlib.image import imread

img = imread('./data/img/lena.gif')
#カレントディレクトリのdataディレクトリの下層に入っているlena.gifを読み込む
plt.imshow(img)

plt.show()

f:id:codingmemos:20170224024831p:plain

もちろん、画像認識を学んでいる先達の皆さんには、説明の必要もないことだが、 上記の画像レナは画像認識の分野では最も有名?の画像ともいってもいいらしい。

レナ (画像データ) - Wikipedia