In [1]:
import numpy as np
def step_function(x):
y = x > 0
return y.astype(np.int)
In [3]:
x = np.array([-1.0, 1.0, 2.0])
x
Out[3]:
In [4]:
y = x > 0
y
Out[4]:
In [5]:
# 0 or 1 のステップ関数なので int に変換してる
y.astype(np.int)
Out[5]:
In [6]:
%matplotlib inline
import matplotlib.pylab as plt
x = np.arange(-5.0, 5.0, 0.1) # -5.0, -4.9 ... 4.9, 5.0
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) # y軸の範囲を指定
plt.show()
In [7]:
def sigmoid(x):
return 1/ (1 + np.exp(-x))
In [8]:
x = np.array([-1.0, 1.0, 2.0])
sigmoid(x)
Out[8]:
In [9]:
t = np.array([1.0, 2.0, 3.0])
print(1.0 + t)
print(1.0 / t)
In [10]:
x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()
In [11]:
def relu(x):
return np.maximum(0, x)
In [12]:
# 多次元配列
A = np.array([1, 2, 3, 4])
print(A)
print(np.ndim(A))
print(A.shape)
print(A.shape[0])
In [13]:
B = np.array([[1, 2], [3, 4], [5, 6]])
print(B)
print(np.ndim(B))
print(B.shape)
In [19]:
# 内積(dot積)
A = np.array([[1,2], [3,4]])
B = np.array([[5,6], [7,8]])
print(A.shape)
print(B.shape)
print(np.dot(A, B))
In [21]:
A = np.array([[1,2,3], [4,5,6]])
B = np.array([[1,2], [3,4], [5,6]])
print(np.dot(A,B))
In [24]:
# 要素数が合わないときのエラー
A = np.array([[1,2], [4,5]])
B = np.array([[1,2], [3,4], [5,6]])
print(np.dot(A,B))
In [28]:
A = np.array([[1,2], [3,4], [5,6]])
B = np.array([1, 2])
print(np.dot(A, B))
In [34]:
# フォワード方向の実装
# 第1層
X = np.array([1.0, 0.5])
W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
B1 = np.array([0.1, 0.2, 0.3])
print(np.dot(X, W1))
A1 = np.dot(X, W1) + B1
print(A1)
Z1 = sigmoid(A1)
print(Z1)
In [42]:
# 第2層
W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
B2 = np.array([0.1, 0.2])
A2 = np.dot(Z1, W2) + B2
print(A2)
Z2 = sigmoid(A2)
print(Z2)
In [44]:
# 第3層
W3 = np.array([[0.1, 0.3], [0.2, 0.4]])
B3 = np.array([0.1, 0.2])
A3 = np.dot(Z2, W3) + B3
Y = A3
print(Y)
In [45]:
# 出力層
# 分類問題 ソフトマックス関数
# 回帰問題 恒等関数
In [2]:
# ソフトマックス関数
a = np.array([0.3, 2.9, 4.0])
exp_a = np.exp(a)
print(exp_a)
sum_exp_a = np.sum(exp_a)
print(sum_exp_a)
y = exp_a / sum_exp_a
print(y)
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
In [8]:
# オーバーフロー対策
a = np.array([1010, 1000, 990])
#print(np.exp(a) / np.sum(np.exp(a))) # オーバーフロー [nan, nan, nan]
c = np.max(a)
a -= c
print(a)
print(np.exp(a) / np.sum(np.exp(a)))
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
In [10]:
a = np.array([0.3, 2.9, 4.0])
y = softmax(a)
print(y)
print(np.sum(y))