Data Analysis/ML & DL

혼자 공부하는 머신러닝+딥러닝 / Chapter 07 딥러닝을 시작합니다

Bay Im 2023. 8. 20. 23:09
Chapter 07-1
인공 신경망

 

- 인공 신경망 (artificial neural network, ANN)

뉴런에서 영감 받은 머신러닝 알고리즘

이미지, 음성, 텍스트 분야에서 뛰어난 성능을 발휘하고 딥러닝이라고도 한다.

케라스이 Sequential 클래스 사용

 

출력층(output layer): z값을 계산하고 이를 바탕으로 클래스를 예측, 신경망의 최종 값을 만든다.

뉴런(neuron): z값을 계산하는 단위, 유닛이라고 부르기도 한다.

입력층: x값이고 픽셀값 자체이기 때문에 특별한 계산을 수행하지 않는다.

밀집층(dense layer): 가장 기본이 되는 층이며 픽셀과 뉴런이 모두 연결된 선이다. 완전 연결층이라고도 부른다.

 

 

- 텐서플로우

구글이 공개한 딥러닝 라이브러리

CPU와 GPU를 사용해서 인공 신경망 모델을 효율적으로 훈련하고 다양한 도구를 제공한다.

 

 

- 활성화 함수(activation function)

뉴런의 선형 방정식 계산 결과에 적용되는 함수 ex) 소프트맥스

 

 

- 원-핫 인코딩(one-hot encoding)

타깃값을 해당 클래스만 1이고 나머지는 모두 0인 배열로 만드는 것

 

 

- 함수 모음

compile(): 훈련 전ㅁ 손실 함수와 측정 지표 등을 지정하는 메소

evaluate(): 케라스에서 모델 성능 평가 메소드

 

 

코랩 실습 화면 (일부)

 

# 인공 신경망으로 패션 아이템 분류
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled, train_target, test_size=0.2, random_state=42)
print("훈련 세트 크기: ", train_scaled.shape, train_target.shape)
print("검증 세트 크기: ", val_scaled.shape, val_target.shape)

dense = keras.layers.Dense(10, activation='softmax', input_shape = (784,))
model = keras.Sequential(dense)
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

print("타깃값: ", train_target[:10])
model.fit(train_scaled, train_target, epochs=5)
print("인공 신경망 모델 성능 점수: ")
model.evaluate(val_scaled, val_target)

 

 

기본 미션
Ch.07(07-1) 확인 문제 풀고, 풀이 과정 정리하기

 

1. 어떤 인공 신경망의 입력 특성이 100개이고 밀집층에 있는 뉴런 개수가 10개일 때 필요한 모델 파라미터의 개수는 몇 개인가요?

정답: 1010개

풀이: 특성 100개와 뉴런 10개를 곱한 후, 뉴런마다 1개의 절편이 있으니 10 더해서 총 1010개의 모델 파라미터가 있다.

 

2. 케라스의 Dense 클래스를 사용해 신경망의 출력층을 만들려고 합니다. 이 신경망이 이진 분류 모델이라면 activation 매개변수에 어떤 활성화 함수를 지정해야 하나요?

정답: sigmoid 함수

풀이: 이진 분류는 뉴런이 1개이고 선형 방정식이다. 선형 방정식의 결과를 확률로 바꾸려면 sigmoid 함수 사용해야 한다.

 

3. 케라스 모델에서 손실 함수와 측정 지표를 지정하는 메서드는 무엇인가요?

정답: compile()

풀이: 이것은 그냥 외우는거라 패스

 

4. 정수 레이블을 타깃으로 가지는 다중 분류 문제일 때 케라스 모델의 compile() 메서드에 지정할 손실 함수로 적절한 것은무엇인가요?

정답: sparse_categorical_crossentropy

풀이: 다중 분류일 경우는 sparse_categorical_crossentropy 매개변수 사용해야 한다.

 

 

 

 

 

Chapter 07-2
심층 신경망

 

- 심층 신경망(deep neural)

2개 이상의 층을 포함한 신경망, 딥러닝을 같은 의미로 사용

Sequential 클래스 사용

모델 만들 때 출력층을 가장 마지막에 두어야 한다.

층을 추가할 때는 add() 메서드를 사용한다

 

은닉층(hidden layer): 입력층과 출력층 사이에 있는 모든 층

 

 

코랩 실습 화면 (일부)

 

# 심층 신경망 만들기
model = keras.Sequential([dense1, dense2])
model.summary()

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

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

 

 

- 렐루 함수(ReLU)

활성화 함수이며 입력이 양수일 경우 입력을 통과시키고 음수일 경우 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'))
model.summary()

(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_categorial_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=5)
model.evaluate(val_scaled, val_target)

 

 

- 옵티마이저(optimizer)

케라스에서 다양한 경사 하강법 알고리즘이며 신경망의 가중치와 절편을 학습하기 위한 알고리즘이다.

ex) SGD, 네스테로프 모멘텀, RMSprop, Adam

 

 

- 함수 모음

add(): Sequential 클래스에서 층을 추가하는 메소드

 

 

선택 미션
Ch.07(07-2) 확인 문제 풀고, 풀이 과정 정리하기

 

1. 다음 중 모델의 add() 메서드 사용법이 올바른 것은 어떤 것인가요?

정답: model.add(keras.layers.Dense(10, activation='relu'))

풀이: Dense 사용할 때 괄호열어서 값 전달해야 한다.

 

2. 크기가 300 * 300인 입력을 케라스 층으로 펼치려고 합니다. 다음 중 어떤 층을 사용해야 하나요?

정답: Flatten

풀이: 입력의 차원이 일렬인 클래스는 Flatten 클래스

 

3. 다음 중에서 이미지 분류를 위한 심층 신경망에 널리 사용되는 케라스의 활성화 함수는 무엇인가요?

정답: relu

풀이: 이미지 처리에 많이 사용되는 활성화 함수는 relu 함수

 

4. 다음 중 적응적 학습률을 사용하지 않는 옵티마이저는 무엇인가요?

정답: SGD

풀이: SGD는 일정한 학습률 사용

 

 

 

 

 

Chapter 07-3
신경망 모델 훈련

 

- 드롭아웃(dropout)

훈련 과정에서 층에 있는 일부 뉴런을 랜덤하게 꺼서 과대적합을 막는 기법이다.

케라스의 Dropout 클래스 사용

 

 

코랩 실습 화면 (일부)

 

# 드롭아웃
model = model_fn(keras.layers.Dropout(0.3))
model.summary()

model.compile(optimizes='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
history = model.fit(train_scaled, train_target, epochs=20, verbose=0, validation_data=(val_scaled, val_target))

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()

 

 

- 콜백(callback)

훈련 과정 중간에 어떤 작업을 수행할 수 있게 하는 객체

케라스의 callbacks 패키지 사용

 

조기 종료: 과대적합이 시작되기 전에 훈련을 미리 중지하는 것

 

 

코랩 실습 화면 (일부)

 

# 콜백
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizes='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.h5', save_best_only=True)
model.fit(train_scaled, train_target, epochs=20, verbose=0, validation_Data=(val_scaled, val_target), callbacks=[checkpoint_cb])

model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizes='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.h5', save_best_only=True)
early_stoppint_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])
print(early_stopping_cb.stopped_epoch)

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
model.evaluate(val_scaled, val_target)

 

 

- 함수 모음

save_weights(): 훈련된 모델의 파라미터를 저장하는 메서드

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

load_weights(): 모든 층의 가중치와 절편을 파일에 읽는다.