関数を試してみる。
①入力
②引数
③出力 を試すときにはまとめておく。
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...]
コメント