コーディング演習2の要点

関数を試してみる。
①入力
②引数
③出力 を試すときにはまとめておく。

Relu関数

def relu(v):
    x = np.maximum(v,0)
    return x

np.maximum()

①
np.maximum(1,0) 

1
②
x= np.array([0,1,3])
y=np.array([3,5,1])
np.maximum(x,y)

array([3, 5, 3])

③
x= np.array([0,1,-3])
np.maximum(x,0)→ベクトルに対して拡張される

array([0, 1, 0])

softmax 関数

np.exp(x)
ネイピア数e を底とする指数関数

def softmax(x):
    exp_x = np.exp(x)
    sum_exp = np.sum (exp_x)
    return exp_x  / sum_exp 

np.sumの注意点

x = np.array([[-1,0,3],[4,-2,-9]])
print(np.sum(x))
→ 13  1次元になってしまう

x = np.array([[-1,0,3],[4,-2,-9]])
print(np.sum(x, axis=0))
print(np.sum(x, axis=1))

→ 
[3,-2,12]
[2,11]
0で列ごと、1で行ごとの計算

オーバーフロー対策

入力ベクトルの各要素から最大値を引き算する

ブロードキャスト対策

[N,M]のベクトルと[N,1]のベクトルの演算はエラーになります。

x=np.array([[1,3],[4,2],[0,5]])
print(x)

[[1 3]
 [4 2]
 [0 5]]

y=np.max(x,axis=1)
print(y)

[3 4 5] 1行にまとめられてしまう。

print(x-y)
ValueError: operands could not be broadcast together with shapes (3,2) (3,) 

このように計算ができない。

転置をするとうまく行く

x=x.T
print(x)

[[1 4 0]
 [3 2 5]]

y=np.max(x, axis = 0)
print(y)

[3 4 5]

print(x-y)
[[-2  0 -5]
 [ 0 -2  0]]

print((x-y).T)
[[-2  0]
 [ 0 -2]
 [-5  0]]

sigmoid関数

softmax関数より簡単

def sigmoid(x,a)
    exp_x = np.exp(-a*x)
    return 1./(1.+ exp_x) np.float指定だと、1を1.0と書かないとエラー

tanh関数

ハイパボリックタンジェント関数、タンエンチと読む。(ハイパボリックとは双曲線という意味)

tanh(x) = sinh(x)/ cosh(x)

sinh(x) = (exp(x) – exp(-x))/ 2

cosh(x)= (exp(x)+exp(-x))/2

def tanh(x):
    sinh =  (np.exp(x) - np.exp(-x))/2
    cosh =  (np.exp(x) + np.exp(-x))/2
    return sinh / cosh

Leaky Relu関数

Leaky ReLU(x,α)={x (x>0)
αx (x≤0)
αは0~1の微少な値

def lrelu(x, alpha=0.01):
    x =  np.maximum(x, alpha*x)
    return x

平均二乗差 コスト関数

#### コスト関数 平均二乗誤差
以下の式で定義される平均二乗誤差を実装します。出題範囲ではないですが、確認しておいてください。
```
引数:
    t: [N, M] (np.float)
    y: [N, M] (np.float)
       Nはバッチサイズにあたる
返値:
    mse: [M] (np.float)
 `t`と`y`の差の2乗の平均を取り、`mse`とします。
 今回のように、M=1(目的変数が一つ)である場合が多い

MSE=1/NM∑iN∑jM (tij−yij)2

def MSE(t, y):
    mse = np.mean(np.square(t - y))
    return mse

多層パーセプトロン導入の例

layer0 = np.array([1,-2])
w1 = np.random.randn(2,50)*0.1
b1 = np.zeros(50, dtype=float)

y = np.dot(layer0, w1) + b1
y = relu(y)
print(y)
print(y.shape)
np.dot 内積の計算

>>> A = np.array([1, 2, 3])
>>> B = np.array([2, 4, 6])
a1b1+a2b2+a3b3のことを計算する
>>> np.dot(A, B)
28

逆伝播の計算方法

np.where

a = np.arrange(9).reshape((3,3))
print(a)
#[[0 1 2]
  [3 4 5]
  [6 7 8]]
print(np.where(a<4, -1,100))
   np.where(条件式, 満たす場合, 満たさない場合)

# [[-1 -1 -1]
  [-1 100 100]
  [100 100 100]]

mask

mask = (x<=0)
print(mask)

[True False True ....]

x[mask] = 0 xの中身がTrueのところのみ、maskが適応される
print(x)

[0, 5 , 1.5, 7 , 0...]

コメント

タイトルとURLをコピーしました