[딥러닝] ✨딥러닝 베이직 ✨

Soo·2023년 12월 2일
0
post-thumbnail

✏️ 확률적 경사 하강법(SGD)을 이용한 로지스틱 회귀 모델

  • 이미지 분류에 유용
  • 가장 간단한 인공 신경망
from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss='log', max_iter=5) # max_iter=5 : 5번 에포크
scores = cross_validate(sc, train_X, train_y, n_jobs=-1)
print(np.mean(scores['test_score']))

✏️ 텐서플로 (TensorFlow)

  • 딥러닝 라이브러리
  • CPU, GPU를 사용해 인공 신경망 모델을 효율적으로 훈련
from tesorflow as tf

💡 케라스(Keras)

  • 텐서플로 내 고수준 API
  • 직접 GPU 실행 X, 백앤드(텐서플로, 씨아노, CNTK 등)와 함께
  • 기본적으로 '미니배치 경사 하강법'사용
from tesorflow import keras
  • 용량이 크기 때문에 교차 검증을 잘 사용 X => 검증 세트는 별도로 덜어내어 사용
from sklearn.model_selection import train_test_split
train_X, val_X, train_y, train_y= \
train_test_split(train_X, train_y, test_size=0.2) 
#test_size=0.2 : 검증 세트는 20%로

1-1.밀집층 만들기

  • 머신러닝과 다른 추가 단계
  • 신경망 중 가장 기본층
  • Dense
    • 밀집층을 만드는 클래스
    • n : 뉴런 개수
    • activation='abc' : 뉴런 출력에 적용할 함수 (보통 'softmax'), 회귀에선 아무 값도 지정 안함
    • input_shape=(x,y) : 입력의 크기
dense = keras.layers.Dense(n,activation='abc',input_shape=(x,y))
  • 이진 분류일 경우 :
    activation='sigmoid'
  • 뉴런이 3개 이상의 다중 분류일 경우 (이진분류 X) :
    activation='softmax' (참고-분류 파트)

1-2. Dense - 은닉층 만들기 for 심층 신경망 1️⃣

  • 출력층(이진-시그모이드, 다중-소프트맥스)에 비해 사용할 수 있는 활성화 함수가 자유로움/ '시그모이드' & '볼 렐루' 함수 주로 사용
"은닉층" 활성화 함수 종류설명
'시그모이드 함수'- 하나의 선형 방정식 출력값을 0~1사이로 압축
- 초창기 인공 신경망 은닉층에서 활용 -> 왼쪽&오른쪽 양 끝이 갈수록 누워있어 신속하게 대응 X
'볼 렐루'- 은닉층에서의 '시그모이드 함수' 단점 보완
- 입력이 양수일 경우, 활성화 함수가 없는 것 처럼 입력 통과 & 음수일 경우, 0으로 변환
  • 몇 개의 뉴런을 둘지는 기준 x, 다만 출력층 뉴런보다 개수가 많아야 함
#은닉층으로 사용할 것
dense1 = keras.layers.Dense(100, activation='sigmoid' input_shape=(784,))
dense2 = keras.layers.Dense(10,activation='softmax')

1-3. '1-2'단계 말고 '2-2'로 바로 넘어가기

2-1. 밀집층을 가진 신경망 모델 만들기

  • 케라스의 Sequential() 사용
# model : 신경망 모델
model = leras.Sequential(dense)
# layer(층)이 2개 이상 일 경우 (은닉층 같이)
# 순서 중요 : 출력층을 가장 마지막에 위치
model = kearas.Sequential([dense1,dense2])
  • model 분석하기 - .summary()
    • Output Shape에서 첫번째 차원 : 샘플 개수 (None / 어떤 배치 크기에도 유연하게 대응 가능)
      fit()메서드에서 batch_size=로 수정 가능
    • Output Shape에서 두번째 차원 : 출력 개수 (100,10 / 입력층보다 적어야 정상
    • Total = dense 1(784*100+10) + dense 2 (100*10+10) = 79510
model.summary()
>>>
Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_1 (Dense)             (None, 100)               78500     
                                                                 
 dense_2 (Dense)             (None, 10)                1010      
                                                                 
=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

2-2. Sequential() - 은닉층 만들기 2️⃣

model = keras.Sequential([
    keras.layers.Dense(100,activation='sigmoid', input_shape =(784,), name = 'hidden'),
    keras.layers.Dense(10,activation='softmax',name='output')
],name='패션 MNIST 모델')
model.summary()
>>>
Model: "패션 MNIST 모델"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 hidden (Dense)              (None, 100)               78500     
                                                                 
 output (Dense)              (None, 10)                1010      
                                                                 
=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

2-3. add() 메서드 - 은닉층 만들기 3️⃣

model = keras.Sequential()
model.add(keras.layers.Dense(100,activation='sigmoid', input_shape=(784,),name='hidden'))
model.add(keras.layers.Dense(10,activation='softmax',name='output'))
model.summary()
>>>
Model: "sequential_2"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 hidden (Dense)              (None, 100)               78500     
                                                                 
 output (Dense)              (None, 10)                1010      
                                                                 
=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

2-4. 렐루 함수 - 은닉층 만들기 3️⃣

  • [참고] Flatten() 메서드
    train_X= train_X.reshape(-1,n)을 통해 1차원으로 변환하던 것을 Flatten 메서드로 간편하게 진행
model = keras.Sequential()
#input_shape=(n,m) : 데이터 크기 n x m
model.add(keras.layers.Flatten(input_shape=(n,m)))
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dense(10,activation='softmax'))
model.summary()
>>>
#Flatten 층이 추가로 생김 -> 784개의 입력이 1차원으로 변환하여 은닉층에 전달
Model: "sequential_5"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 flatten (Flatten)           (None, 784)               0         
                                                                 
 dense_5 (Dense)             (None, 100)               78500     
                                                                 
 dense_6 (Dense)             (None, 10)                1010      
                                                                 
=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

3. 훈련 전 설정

  • model 객체의 compile()메서드 수행 - 손실 함수 & 측정 지표등 지정
  • "손실 함수 종류" 중요
  • metrics=accuracy : 에포크마다 손실도를 알려줄 때, 정확도도 함께 출력
# 원-핫 인코딩이 준비되지 않았을 경우,
model.compile(loss='sparse_categorial_crossentropy', metrics='accuracy')
# 원-핫 인코딩 준비됐을 경우,
model.compile(loss='categorial_crossentropy', metrics='accuracy')

4. 모델 훈련하기

model.fit(train_X, train_y, epochs=5, verbose=1)
#verbose=1 : default / 에포크마다 진행 막대 & 지표 등 표시
#verbose=0: 에포크마다 진행 막대 & 지표 등 표시 X
#verbose=2 : 에포크마다 지표 표시 (진행 막대 표시 X)
>>>>
Epoch 1/5
1500/1500 [==============================] - 8s 3ms/step - loss: 0.6105 - accuracy: 0.7931
Epoch 2/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.4744 - accuracy: 0.8387
Epoch 3/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.4509 - accuracy: 0.8481
Epoch 4/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.4369 - accuracy: 0.8514
Epoch 5/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.4292 - accuracy: 0.8549
<keras.src.callbacks.History at 0x7c8e7d74d870>

5. 모델 검증하기

머신러닝에서 일종의 .score과 동일한 구조

model.evaluate(val_X,val_target)

💡 콜백callback

  • ModelCheckpoint 콜백
    • 에포크마다 모델을 저장
    • save_best_only = True : 가장 낮은 검증 점수를 만드는 모델 저장
    • 혼공머신 408p 참고

💡 조기 종료early stopping

  • 과대 적합 전에, 훈련을 중지하는 것 (훈련 epoch 횟수 제한)
  • 콜백 종류 중 하나
  • 파라미터
    • patience = n : n번 연속 검증 점수가 향상 되지 않으면 훈련 중지
    • restore_best_weights=True : 가장 낮은 검증 손실을 낸 모델 파라미터로 되돌림
  • 혼공머신 409p 참고
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.h5',save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2,restore_best_weights=True)
history=model.fit(train_scaled, train_target, epochs=20,verbose=0, validation_data=(val_scaled, val_target),callbacks=[checkpoint_cb,early_stopping_cb])

💡 딥러닝 하이퍼파라미터

  • 추가할 은닉층의 개수

  • 뉴런 개수

  • 활성화 함수

  • 층의 종류

  • 배치 사이즈 매개변수

  • 에포크 매개변수

  • compile 옵티마이저 설정

    • SGD : 가장 기본 옵티마이저
      • 학습률
        sgd=keras.optimizers.SGD(learning_rate=0.1)
      • 모멘텀 최적화
        보통 모멘텀 매개변수는 0.9 이상 지정
      • 네스테로프
        기본값인 False를 True로 설정 -> 네스테로프 모멘텀 최적화 (네스테로프 가속 경사)
        sgd = keras.optimizers.SGD(momentum=0.9, nestrov=True)
    model.compile(optimizer='sgd',     loss='sparse_categorical_crossentropy',   metrics='accuracy')
    
    혹은
    
    sgd=keras.optimizers.SGD()
    model.compile(optimizer=sgd,   loss='sparse_categorical_crossentropy',   metrics='accuracy')
    • Adagrad : '적응적 학습률'을 사용하는 옵티마이저 1 (default =0.001)
      '적응적 학습률' : 모델이 최적점에 가까울수록 학습률을 낮춤 -> 안정적으로 최적점 수렴
    adagrad=keras.optimizers.Adagrad()
    model.compile(optimizer=adagrad, loss='saprse_categorical_crossentropy',   metrics='accuracy')
    • RMSprop : '적응적 학습률'을 사용하는 옵티마이저 2 (default = 0.001)
    rmsprop=keras.optimizers.RMSprop()
    model.compile(optimizer=rmsprop, loss='saprse_categorical_crossentropy',   metrics='accuracy')
    • Adam : 모멘텀 최적화 + RMSprop
    model.compile(optimizer='adam',   loss='saprse_categorical_crossentropy',   metrics='accuracy')
  • 드롭아웃

    • 훈련이 끝난 뒤, 평가 & 예측시에는 드롭아웃을 적용 X
    • 텐서프로 & 케라스는 자동으로 드롭아웃 적용 X
#30 % 드롭 아웃함
model.add(keras.layers.Dropout(0.3))
  • 등등

✏️ 출처

교재 '혼자 공부하는 머신러닝 + 딥러닝'

profile
데린이인데요 ໒꒰ྀ ˶ • ༝ •˶ ꒱ྀིა (잘못 된 부분은 너그러이 알려주세요.)

0개의 댓글

관련 채용 정보