[혼공머신] 6주차 스터디

만두·2024년 8월 20일
0

혼공머신

목록 보기
6/6

서론

늦어따... 샤따 내리기 전에 얼른 제출하자...


07. 딥러닝

07-1. 인공 신경망

패션 MNIST


  • 60,000개 이미지로 이루어진 훈련 데이터
  • 28 x 28 크기

  • 테스트는 10,000개의 이미지

  • 반전된 흑백 이미지

타깃은 0~9까지의 숫자 레이블로 구성되어 있다.

레이블패션 아이템
0티셔츠
1바지
2스웨터
3드레스
4코트
5샌달
6셔츠
7스니커즈
8가방
9앵클 부츠

로지스틱 회귀로 패션 아이템 분류하기

전체 데이터를 한꺼번에 훈련하는 것보다 샘플을 하나씩 꺼내어 훈련하는 방법이 더 효율적
-> 확률적 경사하강법

  • SGDClassifier
  • 표준화 전처리된 데이터 사용
    • 기울기가 가장 가파른 방향으로 이동하기 때문에
    • 특성마다 값의 범위가 많이 다르면 안됨
    • 패션 MNIST의 픽셀은 0~255 사이의 정수값 -> 0~1 사이의 값으로 정규화

  • 28 * 28 = 784개의 특성이 있음
  • 각 가중치들과 값을 곱한 다음 절편을 더한 것을 각 클래스에 대한 선형방정식으로 구함
  • 계산한 값을 가지고 소프트맥스 함수를 통과하면 각 클래스에 대한 확률 얻을 수 있음
  • 이것이 로지스틱 회귀 였다.

인공 신경망

가장 기본적인 인공신경망은 확률적 경사하강법을 사용하는 로지스틱 회귀와 같다.

  • 클래스 10개 -> z_1 ~ z_10
  • 각 z를 계산하고 이를 바탕으로 클래스 예측
  • 신경망의 최종 값을 만든다는 의미에서 출력층이라고 부름
  • z값을 계산하는 단위를 뉴런(=유닛)
  • 특성들(여기선 784개)를 입력층

인공신경망으로 모델만들기

  1. 검증 세트 나누기
  2. 훈련세트로 모델 만들기
  3. 검증 세트로 훈련한 모델 평가

  • 10개의 패션 아이템을 분류하기 위해 10개의 뉴런으로 구성
  • 케라스의 레이어 패키지 안에는 다양한 층이 준비되어 있음
    • 가장 기본이 되는 층은 밀집층
    • 양쪽의 뉴런이 모두 연결하고 있기 때문에 완전 연결층이라고도 부름
    • 필요한 매개변수 : 뉴런 개수, 뉴런의 출력에 적용할 함수, 입력의 크기

  1. 10개의 뉴런과 100개의 입력 연결 -> 1000개의 가중치. 뉴런마다 1개의 절편
    -> 총 1010개
  2. 이진분류일 때는 sigmoid 함수를 사용함
  3. compile()에서 loss, metrics 로 측정 지표 지정했음
  4. categorical_crossentropy = 원-핫 인코딩일 때
    binary_crossentropy = 이진 분류
    mean_square_error = 회귀 문제

07-2. 심층 신경망

인공 신경망에 층을 더 추가한다.

from tensorflow import keras
(train_input, train_target), (test_input, test_target) =\
keras.datasets.fashion_mnist.load_data()
from sklearn.model_selection import train_test_split

train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28)
train_scaled, val_scaled, train_target, val_target = train_test_split(
    train_scaled, train_target, test_size=0.2, random_state=42)

  • 입력층과 출력층 사이에 밀집층 추가
  • 입력층과 출력층 사이에 있는 모든 층 = 은닉층
  • 활성화 함수 : 신경망 층의 선형방정식의 계산 값에 적용하는 함수
  • 주로 시그모이드 함수볼 렐루 함수 등을 사용
dense1 = keras.layers.Dense(100, activation='sigmoid', input_shape=(784,))
dense2 = keras.layers.Dense(10, activation='softmax')

model = keras.Sequential([dense1, dense2])

  • 맨 첫 줄에 모델 이름
  • 층이 순서대로 나열
  • 층마다 층 이름, 클래스, 출력 크기, 모델 파라미터 개수 출력

층을 추가하는 다른 방법

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 = keras.Sequential()
model.add(keras.layers.Dense(100, activation='sigmoid', input_shape=(784, )))
model.add(keras.layers.Dense(10, activation='softmax'))

렐루 함수

  • 입력이 양수일 경우 마치 활성화 함수가 없는 것처럼 그냥 입력을 통과
  • 음수일 경우에는 0으로 만듦

model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28, 28)))
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))

(train_input, train_target), (test_input, test_target) =\
keras.datasets.fashion_mnist.load_data()

train_scaled = train_input / 255.0
train_scaled, val_scaled, train_target, val_target = train_test_split(
    train_scaled, train_target, test_size=0.2, random_state=42)

model.compile(loss='sparse_categorical_crossentropy')
model.fit(train_scaled, train_target, epochs=5)

옵티마이저

  • 모델이 학습하지 않아 사람이 지정해주어야 하는 파라미터 = 하이퍼파라미터

  • 추가할 은닉층의 개수 = 하이퍼파라미터

  • 은닉층의 뉴런 개수 = 하이퍼파라미터

  • 미니배치 개수 = 하이퍼파라미터

  • epochs = 하이퍼파라미터

  • 케라스는 다양한 종류의 경사하강법 알고리즘을 제공하는데, 이들을 옵티마이저라고 부름.

optimizer 매개변수의 값을 변경해주면 됨.

model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28, 28)))
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(train_scaled, train_target, epochs=5)

  1. add()로 전달
  2. 입력 차원을 일렬로 펼치는건 Flatten 클래스
  3. relu -> 이미지 처리 작업에 사용되는 활성화 함수
    linear -> 선형 활성화 함수, 활성화 함수 적용하지 않는다는 것
    tahn -> 하이퍼볼릭 탄젠트 함수
  4. SGD -> 기본 경사하강법, 모멘텀, 네스테로프 모멘텀 알고리즘 구현할 클래스. 일정한 학습률을 사용
    Adagrad, RMSprop, Adam은 적응적 학습률 옵티마이저
profile
아무것도 모르는 말하는 감자 입니다

0개의 댓글