// 네트워크 가중치 편향값 초기화
def init_network():
network = {}
network["W1"] = np.array([[0.1, 0.5, 1.0], [0.2, 0.6, 1.1]]) // 첫번째 층의 가중치
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 = idenetity_function(a3) // 출력 활성화 함수 ex. softmax
return y
// 네트워크 구현
network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y) // 결과 : shape (2,)인 두 실수의 합이 1인 배열
프로그램 실행 중에 특정 객체를 파일로 저장하는 기능
저장해둔 피클 파일을 로드하면 실행 당시의 객체를 즉시 복원할 수 있다.
// train test dataset load
def get_data():
// 1.data load시에 normalize는 0~1 사이에 정규화를 시켜주는 것이고 2. flatten은 이미지를 1차원으로 변환하는 것이다.(ex) (24,24) -> (576,)) 3. one_hot_label은 정답 라벨만 1 나머지 0
(x_train, t_train), (x_test, t_test) = load_mnist(normalize = True, flatten = True, one_hot_label = False)
return x_test, t_test
// 기존에 있는 가중치들로 네트워크 초기화 (with. pickle)
def init_netwok():
with open("sample_weight.pkl", "rb") as f:
network = pickle.load(f)
return network
// 예측 진행
def predict(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 = softmax(a3)
return y
// 정확도 측정
x, t = get_data()
network = init_network()
accuracy_count = 0
for i in range(len(x)):
y = predict(network ,x[i])
p = np.argmax(y)
if p == t[i]:
accuracy_count += 1
print("정확도 : " + str(float(accuracy_count) / len(x)))
배치란 하나로 묶은 입력 데이터를 의미한다.
배치 처리는 컴퓨터로 계산할때 이미지 한장당 처리 시간을 대폭 줄여준다.
이유 1 : 수치 계산 라이브러리 대부분이 큰 배열을 효율적으로 처리할 수 있도록 고도로 최적화되어 있기 때문
이유 2 : 커다란 신경망에서 데이터 전송이 병목으로 작용하는 경우가 있는데 배치 처리로 버스에 주는 부하를 줄인다
x, t = get_data()
network = init_network()
batch_size = 100 // 배치의 크기
accuracy_cnt = 0
for i in range(0, len(x), batch_size):
x_batch = x[i:i + batch_size]
y_batch = predict(network, x_batch)
p = np.argmax(y_batch, axis = 1)
accuracy_cnt += np.sum(p == t[i:i+batch_size])
print("정확도 : " + str(float(accuracy_count) / len(x)))