1. 오늘의 정리
1) 배우기 전 복습하면 좋을 부분들
2) 오늘 배운 내용
- 단층 퍼셉트론(AND, NAND, OR)
- 다층 퍼셉트론(XOR)
- 계단 함수, 시그모이드 함수, ReLU 함수
- 다차원 배열의 계산
- 3층 신경망 구성하기
- 손글씨 숫자(MNIST)
2. 이해하기 어려웠던 부분
1) 넘파이 복습
자세한 복습
- 차원수 확인 np.ndim(A)
- 형상 확인 A.shape
- 행렬의 곱 np.dot(A,B)
- 형상 바꾸기
- A.reshape(행,열) # 비파괴적
- A.resize(행,열) # 파괴적
- 전치 A.T
- 추가
- axis=0 이면 행으로 추가, axis=1 이면 열로 추가
- np.append(A, B, axis=0) or np.vstack((A,B))
- np.append(A, B, axis=0) or np.hstack((A,B))
- np.tile(A, [2,3]) 행으로 2를 열로 3을 곱한 나열
- np.expand_dims(A, axis=N) 차원 늘리기
3. 기억해야할 부분
1) 구별하여,
A) 다층 퍼셉트론(XOR)
x1 | x2 | s1 | s2 | y |
---|
0 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
- x1, x2를 넣었을 때 y로 XOR 값이 나오려면 어떻게 해야할까?
def XOR(x1, x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
return AND(s1, s2)
2) 활성화 함수
def step_function(x):
return np.array(x>0, dtype=np.int32)
def sigmoid(x):
return 1 / (1+ np.exp(-x))
def relu(x):
return np.maximum(0,x)
2) 잘 쓸 거 같아,
A) 3층 신경망 구성하기
def identy_function(x):
return x
def init_network():
network = {}
network["W1"] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
network["B1"] = np.array([0.1, 0.2, 0.3])
network["W2"] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
network["B2"] = np.array([0.1, 0.2])
network["W3"] = np.array([[0.1, 0.3], [0.2, 0.4]])
network["B3"] = np.array([0.1, 0.2])
return network
def forward(network, X):
W1, W2, W3 = network["W1"], network["W2"], network["W3"]
B1, B2, B3 = network["B1"], network["B2"], network["B3"]
A1 = np.dot(X, W1) + B1
Z1 = sigmoid(A1)
A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid(A2)
A3 = np.dot(Z2, W3) + B3
Y = identy_function(A3)
return Y
network = init_network()
X = np.array([1.0, 0.5])
Y = forward(network, X)
print(Y)
A_1) 소프트맥스 함수
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