[혼공머신] 6주차_ 딥러닝을 시작합니다

배바오·2024년 2월 10일
0

7-1. 인공신경망

📌 패션 MNIST 데이터 준비

  • 훈련 데이터는 총 60000개이며 28 * 28 의 형태로 돼있고, 훈련데이터의 타겟데이터는 60000개의 원소가 있는 1차원배열이다.
  • 테스트 데이터는 총 10000개이며 28 * 28의 형태이고 타겟 데이터는 10000개의 원소가 있는 1차원배열이다.
  • 각 픽셀은 0~255사이의 정숫값을 가지고 보통 255로 나누어 0~1 사이의 값으로 정규화를 함.
레이블0123456789
패션아이템티셔츠바지스웨터드레스코트샌달셔츠스니커즈가방앵클 부츠

각 레이블 별로 샘플이 6000개씩 있음을 확인하였다.

📌 로지스틱 회귀로 패션 MNIST 분류

  • 훈련 샘플이 60000개이므로 샘플을 하나씩 꺼내서 모델을 훈련하는 확률적 경사 하강법이 적절!

  • reshape으로 1차원 배열로 만들기

    28 * 28 = 784 이므로 2차원이 1차원으로 바뀌었음!

  • 반복횟수를 늘려가며 교차검증의 성능 확인

→ 반복횟수를 늘려도 성능이 크게 향상되지는 않음.

  • 패션 MNIST 데이터에서의 로지스틱 회귀 공식
    z티셔츠 = w1 ×\times (픽셀1) + w2 ×\times (픽셀2) + ... + w784 ×\times (픽셀784) + b
    z
    바지 = w1' ×\times (픽셀1) + w2' ×\times (픽셀2) + ... + w784' ×\times (픽셀784) + b
    ...
    z_앵클 부츠 = w1'''''''''' ×\times (픽셀1) + w2'''''''''' ×\times (픽셀2) + ... + w784'''''''''' ×\times (픽셀784) + b

총 10개의 레이블에 대해 각각 로지스틱 회귀공식이 존재하며 각 레이블의 가중치와 절편은 모두 다르다.
선형 방정식을 모두 계산한 후 소프트맥스 함수를 통해 각 클래스에 대한 확률을 알 수 있다.

💡인공 신경망
: 생물학적 뉴런에서 영감을 얻어 모양을 본떠 만든 수학 모델로, 비정형데이터(이미지, 음성, 텍스트)에서 뛰어난 성능을 발휘하여 주목받고 있는 새로운 머신러닝 알고리즘이다. 딥러닝이라고 부르기도 한다.

입력데이터가 들어있는 입력층, 클래스로 예측된 최종 반환값인 출력층, 여러 가중치들과 절편들로 이루어져있다.
이때, 최종 반환값인 출력층은 뉴런으로 이루어져 있다.

  • 딥러닝 라이브러리 텐서플로를 이용

  • 텐서플로를 백엔드로 하는 케라스 라이브러리 이용

  • 훈련 세트와 검증 세트로 분리
    교차 검증을 하기에 시간이 오래걸리고 데이터셋이 충분히 크므로 검증 점수가 안정적이므로 검증 세트를 별도로 분리

  • 밀집층(784개의 픽셀로 만들어진 입력층과 10개의 뉴런으로 이루어진 출력층을 연결하는 선들) 만들기

    → keras.layers.Dense(뉴런 수, 뉴런의 출력에 적용할 함수, 입력의 크기를 튜플로 )

다중분류일때에는 여러 선형 방정식의 출력값을 0~1 사이로 압축학 전체합이 1이 되도록 만들어야해서 활성화함수로 "softmax" 함수이용!
이진분류일때에는 활성화함수로 "sigmoid" 함수이용!

  • 모델 만들기

  • compile 메서드로 손실함수의 종류와 측정값 지정

이진분류에서 주로 손실함수는 'binary_crossentropy'
타깃 : 0 이면
(1-타깃) ×\times -log(1-a)
a가 0에서 멀어질수록 손실이 아주 큰 양수
타깃 : 1 이면
타깃 ×\times -log(a)
a가 1에서 멀어질수록 손실이 아주 큰 양수

다중분류에서 주로 손실함수는 'categorical_crossentropy'
타깃에 해당하는 확률만 남기고 나머지에는 모두 0을 곱해줌.

→ 티셔츠 샘플값(타깃 : 1)에서 손실을 낮추려면 첫번째 뉴런의 활성화 출력 a1의 값을 가능한 1에 가깝게 만들어야 함!
그전에 타깃값을 해당클래스만 1이고 나머지는 모두 0인 배열로 만들어주는 원-핫 인코딩 과정이 필요한데 텐서플로에서는 정수로된 타깃값이어도 원-핫 인코딩 과정없이 바로 sparse_categorical_crossentropy로 손실을 계산할 수 있다.

metrics = 'accuracy' : 정확도를 함께 출력해달라는 의미

  • 모델 훈련

    → 5번 반복하여 정확도가 85%가 넘었고, 검증세트에서도 살짝 낮은 정확도를 보였음.

미션

p.366 확인문제
1) ③
가중치는 입력 특성과 뉴런 개수에 하나씩 대응하도록 있으니까 1000개,
절편은 뉴런마다 하나씩 있으니까 10개
그러므로 총 1010개의 모델 파라미터가 필요하다.

2) ②
이진분류모델일때에는 활성화 함수로 'sigmoid'
다중분류모델일때에는 활성화 함수로 'softmax'

3) ④
compile(loss='',metrics = )
손실함수와 출력하고 싶은 측정값을 지정해줌.

4) ①
정수값을 타깃으로 가지는 다중 분류문제에서 케라스 모델의 compile 메서드에 지정할 함수는 sparse_categorical_crossentropy
원-핫 인코딩없이 바로 손실값 계산 가능

7-2. 심층 신경망

📌 층을 추가해보자!

  • 데이터 불러오기
  • 입력층과 출력층 사이의 모든 층을 은닉층이라고 하는데,
    출력층에서의 활성화 함수보다 다양한 함수들을 사용하며 각 층의 계산이 의미가 있도록 선형 계산을 비선형적으로 비틀어주어야 한다!

은닉층의 활성화함수를 sigmoid 11+ez1 \over 1+e^{-z} 로 출력값을 0과 1 사이로 만듦.
뉴런의 개수를 100이라 했는데 경험을 통해 적절한 뉴런의 개수를 정하면 된다. 단, 출력층의 뉴런보다는 많게!!!

출력층의 활성화 함수는 다중분류이므로 softmax로 설정.

📌 심층 신경망 만들기

Sequential 클래스 객체에 여러 층을 추가하고 맨 마지막에는 출력층을 적어줄 것!
여러 층은 입력 데이터를 여러번 학습하여 인공신경망이 좋은 성능을 내도록 함.

summary를 보면,
모델에 있는 층이 순서대로 나오고 층 이름, 클래스, 출력 크기, 모델 파라미터 개수가 처음 추가한 은닉층부터 출력층까지 모두 출력된다.

출력 크기를 보면 모두 None인데 기본 미니배치 크기가 32임에도 어떤 배치 크기에도 유연하게 대응할 수 있도록 샘플 개수를 고정하지 않았다.
그리고 은닉층의 뉴런을 100개로 두어서 100개가 출력된 것.
즉, 784개의 픽셀 입력값이 100개로 압축됨.

모델 파라미터 개수는 각 784개의 픽셀에 100개의 가중치가 붙고, 100개의 절편이 있으므로 78500이다.

📌 층을 추가하는 다른 방법
① Sequential 클래스의 생성자 안에서 Dense 클래스의 객체를 만드는 경우

② Sequential 클래스의 객체를 만들고 이 객체의 add() 메서드를 호출하는 경우

  • 추가한 층으로 5번 반복하여 모델학습

📌 ReLu 함수

  • 시그모이드함수
    오른쪽과 왼쪽 끝으로 갈수록 그래프가 납작하게 수렴하는 형태여서 올바른 출력을 만드는데 어려웠다. 특히 층이 많아질수록 학습을 더 어렵게 한다!

▲ 시그모이드 함수 그래프
출처 : https://icim.nims.re.kr/post/easyMath/64

  • ReLu 함수
    입력이 양수일때에만 그냥 입력값을 출력하고 음수일 경우에는 0으로 만들어줌. 이미지처리에서 좋은 성능을 내줌.

▲ ReLu 함수 그래프
출처 : https://wikidocs.net/60683


Flatten 클래스를 이용하여 배치차원을 제외한 나머지 입력차원을 모두 일렬로 펼침.
그 후 추가된 층의 활성화 함수를 relu로 설정

Flatten층을 통해 얼만큼의 입력데이터가 은닉층에 전달된것인지 알 수 있다.
reshape을 이용하지 않은 훈련데이터를 다시 준비하여 모델을 훈련

→ 시그모이드를 쓸때보다 좀 더 향상됨.

→ 검증데이터에서도 마찬가지

📌 옵티마이저

  • 하이퍼 파라미터 : 모델이 학습하지 않아 사람이 지정해주어야 하는 파라미터
    ex) 은닉층의 개수, 뉴런 개수, 활성화 함수, 층의 종류, 배치 사이즈 매개변수, 에포크 매개변수 등

  • 옵티마이저 : 신경망의 가중치와 절편을 학습하기 위한 알고리즘
    ex) 케라스의 다양한 경사하강법 알고리즘 : SGD(기본, 미니배치), 네스테로프 모멘텀, RMSprop, Adam

1) SGD 옵티마이저 : learning_rate, momentum, 네스테로프 모멘텀

모멘텀 > 0 : 이전의 그레디언트를 가속도처럼 사용하는 모멘텀 최적화를 사용. 보통 0.9이상 사용
네스테로프 모멘텀 = True : 모멘텀 최적화를 2번 반복하여 구현

2) Adagrad, RMSprop 옵티마이저 : 적응적 학습률 사용

  • 적응적 학습률 : 모델이 최적점에 가까이 갈수록 학습률을 낮추는데 그때의 학습률

3) Adam 옵티마이저 : 모멘텀 최적화와 RMSprop의 장점을 접목

선택미션

p.390-391 확인문제
1) ②
add() 메서드에는 층을 추가하고 Dense 클래스에는 (뉴런수, 활성화함수, 입력 크기)를!

2) ②
케라스에서 층을 1차원으로 펼칠 때는 Flatten

3) ③
이미지 분류에는 relu 활성화함수가 좋다!

4) ①
Adagrad, RMSprop, Adam은 적응적 학습률을 사용하는 옵티마이저

7-3. 신경망 모델 훈련

📌 손실곡선
History 객체에 훈련 과정에서 계산된 손실과 정확도 값이 저장되어 있으므로 이를 사용하여 그래프를 그려보자!

  • 패션 MNIST 데이터를 훈련 세트와 검증세트로 나누기

  • 함수를 통해 모델 만들기

if의 의미 : model_fn() 함수에 층을 추가하면 은닉층 뒤에 또 하나의 층이 추가되는 것.

  • fit의 결과를 history에 저장

  • history안의 key값 확인

  • 에포크에 따른 손실값 그래프로 나타내기

  • 에포크에 따른 정확도 그래프로 나타내기

  • 에포크 횟수를 20으로 늘려서 손실값 그래프로 나타내기

→ 손실이 감소함.

📌 검증 손실

에포크에 따른 과대적합과 과소적합을 알려면 검증세트에 대한 점수도 필요.

  • fit 메서드의 validation_data 매개변수에 검증에 사용할 입력과 타깃값을 튜플로 만들어서 전달

  • history에서 key값 확인

  • 검증 손실과 훈련 손실 모두 그래프에 나타내어 비교

  • 과대적합을 막기위해 Adam 옵티마이저를 이용하여 손실 그래프 비교

📌 드롭 아웃
: 훈련 과정에서 층에 있는 일부 뉴런의 출력을 랜덤하게 0으로 만들어서 과대적합을 막는 방법. 특정 뉴런에 과대하게 의존하는 것을 줄일 수 있음.
일부 뉴런의 출력이 없을 경우에도 더 안정적인 예측을 생성해줌.

  • 모델을 만들때 30%를 드롭아웃

→ 출력을 0으로 만들었다해서 배열의 크기가 달라지지 않았음!!

  • 검증 손실과 훈련 손실 모두 그래프에 나타내어 비교

📌 모델 저장과 복원

  • 10번의 에포크 횟수로 모델 훈련

  • 훈련된 모델의 파라미터는 save_weights()에 저장돼 있음. HDF5 포맷

  • 모델 구조와 모델 파라미터를 함께 저장하는 save() 메서드

  • 두 파일 확인

  • 두 모델 비교

1) 훈련하지 않은 새로운 모델을 만들고, 훈련된 모델의 파라미터를 읽어서 사용

  • 12000개의 샘플에 각각 10개의 확률값이 나오는데 가장 큰 값의 인덱스를 골라 타깃 레이블과 비교하여 정확도 계산

  • 검증 세트의 정확도 출력

→ 20번을 반복하여 모델을 훈련하여 검증 점수가 상승하는 지점을 확인한 후 과대적합 되지 않은 에포크만큼 다시 훈련함. 즉, 두 번씩 반복하여 모델을 훈련한 것. => 해결책 : 콜백!

2) 아예 파라미터 파일에서 새로운 모델을 만들어 바로 사용
💡콜백 : 훈련 과정 중간에 어떤 작업을 수행할 수 있게 하는 객체

  • ModelCheckpoint 콜백 : 에포크마다 모델을 저장하는데 save_best_only=True 매개변수로 가장 낮은 검증 점수를 만드는 모델을 저장할 수 있다.

  • 모델을 만들고 compile 메서드 호출

→ 모델이 훈련한 후에 best-model.h5에 최상의 검증 점수를 낸 모델이 저장됨.

  • 과대적합이 시작되기 전에 훈련을 미리 중지하기 위해 조기종료를 이용
    EarlyStopping 콜백을 ModelCheckpoint 콜백과 함께 사용하여 가장 낮은 검증 손실의 모델을 파일에 저장하고 검증 손실이 다시 상승할 때 훈련을 중지한 후 현재 모델의 파라미터를 최상의 파라미터로 되돌림.

  • 10번째 에포크에서 훈련이 중지됨. patience = 2 이므로 최상의 모델은 8번째 에포크일때

  • 훈련 손실과 검증 손실 그래프

  • 검증세트에 대한 성능 확인

profile
통계를 판다

0개의 댓글