MNIST 데이터를 이용한 글자 인식 프로그램 (2)

2019. 10. 8. 23:20해봤던것들

OpenCV로 결과 나타내기

 직접 그린 글씨를 어떤 숫자로 인식했고 어느 정도의 정확도가 나왔는지 확인하기 위해 openCV 사용해 결과를 출력했습니다.

 

dst[:,:] = 0 #지우기
b,g,r,a = 0,255,0,0
cv2.putText(dst, text1, (0,15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (b,g,r), 1, cv2.LINE_AA)
cv2.putText(dst, text2, (160,360), cv2.FONT_HERSHEY_SIMPLEX, 10, (b,g,r), 3, cv2.LINE_AA)
 
## 정답그리기 
cv2.imshow('dst', dst)
Colored by Color Scripter

 CV창에는 이미 글씨가 그려져 있는 상태이기 때문에 CV창을 아무것도 없는 상태가 되도록 지웁니다.

지워진 CV창에 예측한 결과와 정확도를 cv2.putText라는 함수를 사용해서 출력했습니다.

 

정답, 정확도 출력


학습방법 비교

 오차역전파법을 알아보기 전에 역전파방법을 알아보겠습니다. 역전파방법을 학습할 때는 은닉층이 사라진 2 신경망을 사용했습니다. 은닉층의 활성화함수로 Sigmoid 사용했기 때문에 단순신경망과 차이점은 없었습니다.

 

*역전파방법 학습, 예측에서 신경망

[입력>>Affine-Sigmoid>>Affine-Softmax]

 

 오차역전파법으로 학습할 때는 역전파방법의 신경망과 같은 층의 신경망을 사용했지만 은닉층에 Relu함수를 사용했고 출력층에 SoftmaxWithLoss 함수를 사용했습니다. 하지만 예측 값을 구할 때는 이미 학습된 매개변수를 사용하기 때문에 SoftmaxWithLoss 함수가 아닌 Softmax 함수를 사용해서 예측 값을 구했습니다.

 

*오차역전파방법 학습에서 신경망

[입력>>Affine-Relu>>Affine- SoftmaxWithLoss]

*오차역전파방법 예측에서 신경망

[입력>>Affine-Relu>>Affine-Softmax]

x = x.reshape(1, 1, 28, 28) #x 데이터 성형
N, C, H, W = x.shape
FN, C, FH, FW = W1.shape
out_h = int(1 + (H + 2 * 0 - FH) / 2)
out_w = int(1 + (W + 2 * 0 - FW) / 2)
col = im2col(x, FH, FW, 1, 0)
col_W = W1.reshape(FN, -1).T  # 필터 전개
out = np.dot(col, col_W) + b1
out = out.reshape(N, out_h, out_w, -1)
a1 = out

 합성곱 계층에서는 4차원의 이미지데이터를 그대로 이용하기 때문에 1차원으로 flatten 해줬던 데이터를 4차원으로 reshape 했습니다. (out_h out_w 합성곱 과정을 거치고 출력되는 데이터의 높이와 너비입니다.)

2차원의 필터와 곱하기위해 im2col 사용해서 4차원의x데이터를2차원으로 변형시킵니다. 2차원의 필터를 1열씩 x데이터와 곱해주기 위해 학습할 때는 필터를 1열로 전개합니다.

 위 코드에서는 예측하기위해 W1.reshape(FN, -1).T 가중치 값을 1열로 전개하고 행렬 합니다.

그림으로 나타내면 아래와 같습니다.

 

곱해진 값에 편향 b 더하고 4차원행렬로 rehape합니다. 출력된 데이터는 Relu 거쳐 Polling계층으로 갑니다.

N, C, H, W = z1.shape
out_h = int(1 + (H - 2 * 0 - FH) / 2)
out_w = int(1 + (W - 2 * 0 - FW) / 2)

z1 = im2col(z1, 2, 2, stride = 2, pad = 0)
z1 = z1.reshape(-1, 2*2)
z1 = np.max(z1, axis=1)

 위 코드는 Polling계층의 코드입니다. Polling 전개한 , 전개한 행렬에서 최댓값을 구하는 방법입니다. 은닉층에서Affine 해줘야 하기 때문에 Z1 W2행렬을 곱해야 하는데 가중치 W2 (4320,100) 행렬을 가지기 때문에 np.max(z1, axis=1) z1(4320,)행렬을 따로 성형해주지는 않았습니다.

 이후의 과정은 위에 설명한 다른 학습 방법과 동일하게 진행됩니다.

*CNN학습방법 예측에서 신경망

[입력>>Conv-Relu-Polling>> Affine-Relu >>Affine-Softmax]

 

학습을 모두 마쳤기 때문에 같은 이미지를 넣고 비교해 보겠습니다.


 

불러오는 중입니다...

https://github.com/Yeowoolee/Deep-Learning-MNIST-dataset