순전파 (forward propagation)

rokky·2023년 11월 3일
0

딥러닝

목록 보기
18/18

순전파

  • 순전파라는 것은 입력 데이터를 기반으로 은닉층을 거쳐 출력층으로 차례대로 변수들을 계산하고 추론한 결과를 의미한다.

단순한 구현

// 네트워크 가중치 편향값 초기화 
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인 배열

pickle

  • 프로그램 실행 중에 특정 객체를 파일로 저장하는 기능

  • 저장해둔 피클 파일을 로드하면 실행 당시의 객체를 즉시 복원할 수 있다.

mnist 손글씨(label = 10개 (0~9))신경망 추론

// 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)))

batch

  • 배치란 하나로 묶은 입력 데이터를 의미한다.

  • 배치 처리는 컴퓨터로 계산할때 이미지 한장당 처리 시간을 대폭 줄여준다.

  • 이유 1 : 수치 계산 라이브러리 대부분이 큰 배열을 효율적으로 처리할 수 있도록 고도로 최적화되어 있기 때문

  • 이유 2 : 커다란 신경망에서 데이터 전송이 병목으로 작용하는 경우가 있는데 배치 처리로 버스에 주는 부하를 줄인다

batch 구현

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)))

0개의 댓글