tensorflow를 통해서 레이어의 신경망 설계를 통해 패턴을 인지할 수 있도록 하고, 딥러닝으로 가능한 모든 템플렛을 제공할 수 있다.
이전 섹션에서는 머신러닝의 패러다임이 무엇이고, 데이터와 레이블을 어떻게 사용하며, 컴퓨터가 그것들로부터 규칙을 알아내는 방법을 살펴봤다.
간단한 예시로부터 두 숫자 세트간의 관계도 알아냈다.
다음 단계로는 computer vision 문제를 해결해보자.
컴퓨터 비전은 컴퓨터로 하여금 이미지를 이해하고 레이블링하는 분야이다.
우리는 무엇이 셔츠이고 신발인지 구별할 수 있다.
반면에 프로그램은 어떻게 구분할 수 있을까?
옷을 한번도 보지 못한 외계인에게 신발을 어떻게 설명해야 할까?
이것은 매우 어려운 일일 것이다.
컴퓨터 비전도 이와 같은데, 이를 해결하기 위해서 많은 옷 사진을 통해서 컴퓨터로 하여금 무슨 사진인지 식별하게 하고 그 패턴을 학습시켜서 신발과 셔츠, 핸드백 그리고 코트의 차이점을 알려주는 방법이 있다.
Fashion MNIST라는 10개의 의류 아이템 카테고리를 가진 7만 개의 이미지 세트가 존재하고, 이 이미지는 28x 28 픽셀로 축소되었다.
보통 더 작은 픽셀일수록 좋은데 컴퓨터의 처리량이 적어지기 때문이다.
물론 충분한 정보량을 유지하며 특징과 대상이 구별될 수 있도록 할 필요가 있다.
위 사진을 보면 여전히 셔츠와 신발, 핸드백 사이즈를 구분할 수 있는 사이즈로 보이므로 이는 신경망을 훈련시키는 데 도 적절하다.
또 이 이미지는 흑백 처리(gray scale)로 정보량이 축소되어있다.
각 픽셀은 0~255 사이의 값으로 대체되어 픽셀당 1바이트의 크기를 가진다.
전체 이미지를 저장하는 데에 28x28 픽셀 이미지는 784바이트만 필요하다.
이 이미지가 무엇인지 여전히 구분할 수 있는데, 위 사진으로 보기에는 앵클부츠인 것을 볼 수 있다.
이전에는 숫자 여섯 쌍을 가지고 하드 코딩 했다면,
이번에는 디스크에서 7만 개의 이미지를 불러와서 이를 처리하기 위한 코드를 작성한다.
Tensorflow 의 Fashion-MNIST가 API 호출이 있는 데이터 세트로 존재한다.
단순히 Keras 데이터베이스에서 MNIST 유형의 오브젝트를 선언하면 된다.
이 오브젝트에서 load_data 메서드를 호출하면, 4개의 목록이 반환된다.
훈련 데이터, 훈련 레이블, 테스트 데이터, 테스트 레이블이다.
신경망을 구축할 때 좋은 전략은 일부 데이터를 이용해서 신경망을 훈련시키고, 모델에 아직 보여주지 않은 유사한 데이터로 이미지 인식 성능을 확인하는 게 좋다.
Fashion-MNIST 데이터 세트에서 6만개의 이미지로 신경망을 훈련시키고, 이전에 보여주지 않은 1만장의 이미지로 모델의 성능이 얼마나 좋은지 테스트할 수 있다.
각 세트는 데이터와 이미지 자체가 들어 있고, 실제 이미지를 나타내는 레이블이 있다.
훈련 데이터에는 이런 이미지와 함께 이미지를 설명하는 레이블이 포함ㄷ괸다.
이 이미지는 앵클 부츠이고, 레이블은 숫자 9이다.
이러한 이미지에 대한 설명의 레이블을 숫자로 표현하는 이유는
첫번째로는 컴퓨터는 텍스트보다 숫자를 더 잘 다루기 때문이다.
두번째로는 편향을 줄일 수 있기 때문이다
앵클 부츠라고 레이블을 지정하면, 영어 화자에 편향되어 있는 것이다
그러나 숫자 레이블을 사용하면 이 레이블을 언급할 때 적절한 언어로 표현할 수 있다. 영어나, 중국어 그리고 일본어, 아일랜드어로도 가능하게 된다.
이제 신경망을 정의하는 코드를 살펴보자.
지난번에는 레이어를 1개 가진 시퀀스 였지만 이번에는 3 개의 레이어이다.
여기서 중요한 것은 첫 번째와 마지막 레이어이다
10종류의 옷에 대한 데이터 세트를 가지고 있기 때문에 마지막 레이어는 10개의 뉴런을 가졌다. 이 둘은 항상 일치해야 한다.
첫 번째 레이어는 28x28 입력 크기를 가진 Flatten 레이어이다.
이 이미지들의 사이즈를 기억한다면 입력 데이터의 크기 역시 28x28 이라는 것을 알 수 있다. Flatten Layer 는 28x28의 2차원 배열을 단순한 1차원 배열로 변경해준다.
재밌는 점은 때로는 히든 레이어라는 이 가운데 있는 레이어에서 발생하는데
128개의 뉴런이 있지만 단순히 이 함수의 변수라고 생각하면된다.
x1, x2, x3처럼 불리기도 한다.
앵클 부츠의 784개의 픽셀 값이 모두 9의 값에 속하게 되는 분류 규칙이 하나 있다. 그리고 나머지 7만개의 데이터에도 비슷한 분류 규칙이 적용된다.
신경망이 하는 일이지만 직접 매핑해서 보기에는 너무 복잡하다.
예를 들어 그 함수를 y = w1x1 + w2x2 + ... + w128x128 으로 가정해 본다면 입력 데이터(신발) 값을 받았을 때 모든 w의 값을 찾으면서 y는 9가 된다.
기존의 y=2x-1을 해결했을 때와 매우 비슷하다는 것을 알 수 있다.
그경우 '2' 는 x의 가중치였고 y=w1x1 ... 이라는 것이다.
신경망이 동작하는 것을 보는 것과 그 동작의 이해를 돕는 다양한 도구들이 있기 때문에 점차 이해할 수 있게 될 것이다.
지금은 코드를 통해서 분류를 잘 하는 것이 더 중요하다.
레이어 사이즈의 증가, 감소, 변화가 끼치는 영향을 보기 위해 신경망 조절도 가능하다.
더 상세한 내용이 궁금하다면 Dense 레이어가 이론적, 수학적 관점에서 어떻게 동작하는 지를 명확하게 설명해주는 youtube 강의를 참고하면 된다.
eopch에 상관없이 원하는 지점에 도달했을 때 훈련을 어떻게 멈출 수 있을까?
epoch 수를 특정 짓기 위해서는 항상 코드로 정의해야 할까?
콜백(Callback) 함수를 통해서 매 epoch가 끝나면 매트릭스를 확인할 수 있다.
만약 목표를 달성했다면 그 시점에서 학습을 종료할 수 있다.
패션 아이템을 구분하는 신경망을 훈련하기 위한 코드에서,
훈련 루프를 수행하는 model.fit 함수부분을 살펴보자.
python으로 콜백함수를 작성하고, 개별 클래스로 구현했지만 다른 코드 사이에 인라인될 수 있기 때문에 독립된 파일일 필요는 ㅇ벗다.
매 epoch 끝에 콜백에 의해 호출되는 on_epoch_end 함수를 통해서 구현해보자.
현재 훈련 상태에 관한 많은 정보를 포함하는 log object 도 함께 전달된다.
예를 들어 현재 손실을 조회할 수 있게 도와주고,
이 코드는 손실이 0.4 보다 작다면 훈련을 종료하게 만들어준다.
두 가지를 추가로 수정해서, 이 코드를 통해 만든 클래스를 인스턴스화 한다.
다음 model.fit에 callbacks 파라미터를 통해서 클래스의 인스턴스 객체를 호추한다.