이 코드로 모델을 (입력 상자에 지정된) 10 에포크 동안 훈련하여 그림 4-8에 있는 손실과 정확도 곡선을 얻었습니다. 그래프에서 볼 수 있듯이 손실과 정확도는 훈련 에포크 끝을 향해 수렴해 갑니다. 검증 손실과 정확도 값은 훈련 손실과 정확도에서 너무 크게 벗어나지 않습니다. 이는 심각한 과대적합이 없다는 것을 의미합니다. 마지막 model.evaluate() 메서드 호출은 99.0%에 가까운 정확도를 보여 줍니다(가중치를 랜덤하게 초기화하고 훈련하는 동안 샘플을 랜덤하게 섞기 때문에 실제 값은 실행할 때마다 조금씩 다릅니다).
▲ 그림 4-8 MNIST 합성곱 신경망의 훈련 곡선. 10 에포크 동안 훈련했으므로 각 에포크는 약 800번의 배치로 구성된다. 왼쪽: 손실 곡선, 오른쪽: 정확도 곡선. 훈련과 검증 세트에 대한 값은 다른 색으로 표시되어 있다. 훈련 배치와 달리 검증은 에포크가 끝날 때마다 한 번씩만 수행되기 때문에 검증 곡선은 훈련 곡선보다 적은 데이터 포인트로 구성되어 있다.
99.0%는 얼마나 좋은가요? 실용적인 관점으로 보면 납득할 만한 수준이지만 최고 수준의 성능은 아닙니다. 모델에 합성곱 층 및 풀링 층의 개수와 필터의 개수를 늘려 99.5%의 정확도를 달성할 수 있습니다. 하지만 규모가 큰 합성곱 신경망은 브라우저에서 훈련하는 데 시간이 많이 걸립니다. 따라서 Node.js와 같이 자원 제약이 적은 환경에서 훈련하는 것이 합리적입니다. 4.3절에서 이렇게 하는 방법을 설명하겠습니다.