【Aidemy】 ディープラーニングで手書き数字を識別してみよう①

Aidemyのディープラーニングで手書き数字を識別してみよう!に取り組んだので記録用に。
基本的にはやったことずらずら書き連ねただけ。
今回はコース1:Python入門〜コース2:Numpyを用いた数値計算をやった。

Python入門

Pythonの基礎。飛ばしてもよかったな、、、。

Numpy入門

  • Pythonでベクトルや行列計算を高速に行うことができるライブラリ。
計算速度比較
# 実際に(150, 150)の行列の掛け算
Pythonの機能のみでの計算結果:3.75[sec]
Numpyを使った場合の計算結果:0.00[sec]
スライス
arr2 = arr[:].copy()

num_list2 = num_list[:] # listならこれでOK
ブールインデックス参照
arr = [1, 2, 3, 4, 5, 6]
print(arr % 2 == 0)      #=> [False True False True False True]
print(arr[arr % 2 == 0]) #=> [2, 4, 6]
集合関数
arr1 = [2, 5, 7, 9, 5, 2]
arr2 = [2, 5, 8, 3, 1]

# arr1の重複をなくす
# new_arr1 = [2, 5, 7, 9]
new_arr1 = np.unique(arr1)

# new_arr1とarr2の和集合
# [1 2 3 5 7 8 9]
np.union1d(new_arr1, arr2)

# new_arr1とarr2の積集合
# [2 5]
np.intersect1d(new_arr1, arr2)

# new_arr1からarr2を引いた差集合
# [7 9]
np.setdiff1d(arr1, arr2)
乱数
np.random.rand()           # 一様乱数
np.random.randint(x, y, z) # x以上y未満のshapeがzの乱数
np.random.normal           # ガウス分布
axis
  • 列方向の処理がaxis=0、行方向の処理がaxis=1 f:id:hanhan39:20180219150414p:plain
arr = np.array([[1, 2, 3], [4, 5, 12], [15, 20, 22]])
arr.sum()       #=> 84 
arr.sum(axis=0) #=> [20 27 37]
arr.sum(axis=1) #=> [6 21 57]
ファンシーインデックス参照
  • インデックス参照にインデックスの配列を用いる方法
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 

print(arr[[2, 0]]) 
# 出力結果(コピーを返す)
[[7 8 9]
 [1 2 3]]
転地行列
np.transpose(arr)
ソート
arr = ([[4, 2, 5], [3, 1, 9]])

arr.argsort(arr) #=> [[2 1 0] [2 0 1]]
arr.sort(arr)    #=> [[2 4 8] [1 3 5]]
行列計算
# arr1とarr2の行列積
print(np.dot(arr1, arr2))
# vecのノルム
print(np.linalg.norm(vec))
統計関数
np.mean()   # 平均
np.sum()    # 合計
np.max()    # 最大値
np.min()    # 最小値
np.argmax() # 最大値を取るインデックス
np.argmin() # 最小値を取るインデックス
np.std()    # 標準偏差
np.var()    # 分散
ブロードキャスト
  • 2つのndarray同士の演算時にサイズの小さい配列の列もしくは行を自動で大きい配列に合わせる
  • すべての配列で可能なわけではないが、すべての要素に同じ処理をするときなどはブロードキャスト可能