konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

E資格対策 で丸暗記した Pythonコード

f:id:konchangakita:20210311202353p:plain

とうとうこれを堂々と使うことができます
JDLA E資格 2021#1 取得しました

喜びとともに忘れないうちに試験の振り返り第2段
Pythonコード問題は、基本的に穴埋めなので何がやりたいかを理解していれば時間さえかければ答えにたどり着くことはできるわけですが、試験時間もそんなに余裕があるものではないので公式の丸暗記と一緒で、時間短縮には結構大切かも

python コード

順伝播と誤差逆伝播

基本中の基本、コードを書いてると自然と覚えてるもんですが(デバッグもできるし)、いざ4択になると転置とかいるっけ?とか混乱するかも

アフィン変換 順伝播
f:id:konchangakita:20210227140515p:plain

y = np.dot(x, w) + b

アフィン変換 誤差逆伝播
f:id:konchangakita:20210227141607p:plain

dx = np.dot(dout, w.T)
dw = np.dot(x.T, dout)
db = np.sum(dout, axis=0)
活性化関数の勾配

シグモイドの勾配

dout = dout * (1.0 - out) * out 

tanh(ハイパボリックタンジェント

dout = (1.0 - y**2)

ReLUの勾配
順伝播で「0」にした部分を覚えておいて、0にする

dout[relu_mask] = 0
損失関数(コスト関数)の勾配

平均二乗誤差の勾配

d = -2 * (t - y) # t: 正解データ、y: 予測データ

交差エントロピーの勾配

delta = 1e-8
dout = -np.mean(t * np.log(y + delta))

交差エントロピー with ソフトマックス

dout = y - t 
最適化関数

SDG
モーメント
ネストロフのモーメント
AdaGrad
RMSprop
Adam


バッチノーマライゼーション

これが結構有用で、標準偏差を求める式も一緒に頭に叩き込めます

mu = np.mean(x, axis=0)  #平均
xc = x - mu  # 今回のミニバッチの平均との差分
var = np.mean(xc**2, axis=0)  # 分散
std = np.sqrt(var + 10e-7)   # 今回のミニバッチの標準偏差
xn = xc / std  # 正規化
CNN の im2col

これは 畳み込み処理の頻出問題のようなので、覚えておいて損はない

for y in range(filter_h):
    y_max = y + stride*out_h
    for x in range(filter_w):
        x_max = x + stride*out_w
        col[:, :, y, x, :, :] = img[:,:, y:y_max:stride, x:x_max:stride]

特に重要なのはココ

col[:, :, y, x, :, :] = img[:,:, y:y_max:stride, x:x_max:stride]

必要なのは、shape がどうなっているかを意識しておけば、im2col かかわる応用問題にも対応できるようになります
N:バッチサイズ
Ch:入力チャネル
H, W:入力高さ、 横幅
out_H, out_W:出力高さ、横幅

(N, Ch, H, W) ➔ (N*out_H*out_W, C*H*W)

LSTMの重み計算

LSTM覚えておけば、GRUも簡単に連想できます
特徴は、各ゲート分の重みをいっぺんに計算しておいて、各ゲート用にスライスして取り出すところになります

A = np.dot(h_prev, wh) + np.dot(x, wx) + b  # 各ゲート用の[N,4H] まとめて計算

# slice
f = sigmoid(A[:, :H])       # 忘却ゲート [N,H]
i = sigmoid(A[:, 2*H:3*H])  # 入力ゲート [N,H]
g = np.tanh(A[:, H:2*H])    
o = sigmoid(A[:, 3*H:])     # 出力ゲート [N,H]

おわりに

これからは実践活用のAI構築をやっていこう
KPS へ導入すっぞ!