• 카테고리

    질문 & 답변
  • 세부 분야

    컴퓨터 비전

  • 해결 여부

    미해결

안녕하세요 정확도에 대한 질문

20.04.26 20:13 작성 조회수 289

0

지금까지 에러 없이 잘 실행하였는데 정확도가 엄청 낮게 나와요

강의에서 753을 한 결과는

353으로 나오고

제가 1 7 을 적어서 찍어서 직접 돌린결과는

3 7이 나오네요..

정확도를 높일 수 없을까요??

답변 1

답변을 작성해보세요.

1

안녕하세요?

좋은 질문해주셨네요. 강의에서도 설명드렸지만 이 예제는 직접 쓴 손글씨를 인식하는 것을 실행을 해보기 위한 주제라 정확도면에서 아쉬운 점이 있습니다. 강의를 진행하면서 이 후에 정확도를 높이는 여러 가지 방법을 소개하지만 당장 MNIST모델의 정확도를 높이는 방법을 소개해 드리겠습니다. 물론 모델 말고도 상용서비스를 한다면 프로그램에도 다양한 필터, 기법, 예외처리 등 보완해서 인식률을 높이는 여러 방법이 필요하겠지만 일단 모델 자체도 실습을 위해서 간단하게 학습해서 만들었기 때문에 정확도에 한계가 있습니다.

이전 단원에서 저희가 MNIST모델을 만들었던 RBP_DL11_MNIST_model.ipynb파일을 보면 학습할 때 4개의 레이어만으로 모델을 만들었습니다.

model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(num_classes, activation='softmax')

])

텐서플로에서 제공하는 다른 예제를 보면 모델을 보다 정교한 레이어로 만들어서 인식률을 높이는 방법을 제시하고 있습니다. 물론 이럴 경우 학습에 보다 많은 시간과 리소스를 필요로 하기 때문이지요. 예제는 colab파일인데 주소는 아래와 같습니다.

https://colab.research.google.com/github/tensorflow/examples/blob/master/lite/examples/digit_classifier/ml/mnist_tflite.ipynb

아래 내용처럼 relu를 사용하는 dense layer를 복잡한 Convolution layers로 바꿔주면 정확도로 높아진다고 나오고 있습니다.

참고로 아래의 결과를 가져오는 keras.layers.Dense(10) 레이어는 지우면 안됩니다.

# Define the model architecture
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=tf.nn.relu),

# Optional: You can replace the dense layer above with the convolution layers below to get higher accuracy.
# keras.layers.Reshape(target_shape=(28, 28, 1)),
# keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation=tf.nn.relu),
# keras.layers.Conv2D(filters=64, kernel_size=(3, 3), activation=tf.nn.relu),
# keras.layers.MaxPooling2D(pool_size=(2, 2)),
# keras.layers.Dropout(0.25),
# keras.layers.Flatten(input_shape=(28, 28)),
# keras.layers.Dense(128, activation=tf.nn.relu),
# keras.layers.Dropout(0.5),

keras.layers.Dense(10)

]) 

이렇세 모델을 개선해서(문법은 살짝 다르므로 keras.layers  를 tf.keras.layers로 바꾸세요.) 새로 모델파일을 만들면 인식률이 높아질 겁니다. 

그런데 제가 MNIST모델과 다른 모델을 학습하고 실행해 보면서 경험한 것은  일단 학습에 사용한 사진 자체가 우리가 사용하는 방식과 다를 수 있다는 겁니다. 아시겠지만 MNIST는 미국사람이 쓴 손글씨로 우리가 쓰는 숫자와 쓰는 방식이 약간 다르더라고요. 사용하신 7과 1의 경우를 보면 1의 경우 약간 안으로 굽어들게 쓰셨는데 이걸 3의 특성으로 인식할 수 있습니다. 한번 MNIST데이터에 있는 손글씨를 출력해 보시면 이해가 가실 수 있습니다. 이 모델 뿐 아니라 다른 과정에서 성별과 나이를 식별하는 모델을 사용하는데 이럴 경우 학습에 사용된 얼굴 이미지들이 모두 서양 사람들의 이미지라 저희 얼굴에서 정확도가 떨어지는 경우를 확인합니다.

그래서 제가 관련된 실제 프로젝트를 하면서 어떻게 새로 사진 데이터를 모을 수 있느냐를 고민하고 있습니다. 결국 보다 높은 정확도를 필요로 하면 근본적으로 사진 데이터부터 충분히 모을 필요도 있습니다.

도움되시길 바랍니다.

감사합니다.