Sam Park Blog.

Sam의 워드프레스 블로그

Sam Park Blog.

Sam의 워드프레스 블로그

미분류

[혼공머신] 6주차 딥러닝을 시작합니다 (인공 신경망, 심층 신경망, 신경망 모델 훈련)

Chapter 07 딥러닝을 시작합니다

인공 신경망의 기본적인 구성과 동작 원리부터, 더 복잡한 심층 신경망으로 발전하는 과정, 그리고 모델을 효율적으로 훈련하고 최적의 성능을 끌어내는 다양한 기법들을 실제 코드를 통해서 딥러닝의 원리를 이해하는데 도움이 되었습니다.




07-1 인공 신경망

패션 MNIST 데이터셋을 활용하여 옷 이미지를 분류하는 과제를 수행하며, 전통적인 로지스틱 회귀 모델과 비교하여 인공 신경망이 어떤 점에서 뛰어난 성능을 보이는지를 알수 있었습니다.

데이터를 준비하고 전처리하는 과정에서 이미지 픽셀 값을 0~1 범위로 정규화하고, 2차원 이미지를 1차원 배열로 변환한후, keras.Sequential API를 사용하여 입력층과 출력층을 갖춘 기본적인 인공 신경망 모델을 만들고, sparse_categorical_crossentropy 손실 함수와 accuracy 지표를 설정하여 모델을 컴파일 하고 훈련하는 일련의 과정을 이해했습니다.

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

train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28)

from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss='log_loss', max_iter=5, random_state=42)

model = keras.Sequential([
    keras.layers.Input(shape=(784,)),
    keras.layers.Dense(10, activation='softmax')
])

model.compile(loss='sparse_categorical_crossentropy', metrics=['accuracy'])

model.fit(train_scaled, train_target, epochs=5)




07-2 심층 신경망

인공 신경망을 바탕으로 심층 신경망의 개념을 학습하였으며, 이는 모델 여러 개의 은닉층을 추가하여 신경망을 더 깊게 만드는 것입니다.

훈련 데이터를 훈련 세트와 검증 세트로 분리하여 모델 성능을 평가하고, 모델의 층을 추가하는 다양한 방식과 함께, 이미지 데이터를 1차원으로 효과적으로 변환하는 Flatten 층의 사용법을 배웠습니다. 또한, 딥러닝 모델에서 흔히 사용되는 ReLU 활성화 함수와 모델의 학습 과정을 최적화하는 Adam 옵티마이저를 사용함으로써 모델의 학습 효율과 성능을 개선할 수 있었습니다.

import keras
from sklearn.model_selection import train_test_split

(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 = keras.Sequential()
model.add(keras.layers.Input(shape=(28,28)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 모델 훈련 및 평가
model.fit(train_scaled, train_target, epochs=5)
model.evaluate(val_scaled, val_target)




07-3 신경망 모델 훈련

마지막으로 신경망 모델을 효율적으로 훈련하고 최적의 성능을 달성하기 위한 여러 전략들을 학습했으며, 모델의 학습 진행 상황을 파악하고, 과대적합을 관리하여, 훈련된 모델을 효과적으로 관리하는 방법들을 다뤘습니다.

훈련 세트와 검증 세트의 손실 곡선을 그래프로 시각화하여 모델의 학습 추이와 과대적합 발생 여부를 분석하는 방법을 배웠으며, 드롭아웃 층을 모델에 추가하여 훈련 시 일부 뉴런을 랜덤하게 비활성화함으로써 과대적합을 효과적으로 줄일 수 있다는 것을 이해했습니다. 또한, 훈련된 모델 전체나 모델의 가중치만을 저장하고 필요할 때 다시 불러와 사용하는 방법을 익혔습니다. ModelCheckpoint 와 EarlyStopping 같은 콜백(Callback) 함수들을 활용하여 모델 훈련 과정을 더욱 효율적으로 제어하는 방법을 배웠습니다.

import keras
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

(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)

def model_fn(a_layer=None):
  model = keras.Sequential()
  model.add(keras.layers.Input(shape=(28,28)))
  model.add(keras.layers.Flatten())
  model.add(keras.layers.Dense(100, activation='relu'))
  if a_layer:
    model.add(a_layer)
  model.add(keras.layers.Dense(10, activation='softmax'))
  return model

model = model_fn()
model.compile(optimizer='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'], label='train_loss')
plt.plot(history.history['val_loss'], label='val_loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend()
plt.show()

model_dropout = model_fn(keras.layers.Dropout(0.3))
model_dropout.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.keras', save_best_only=True) 
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2, restore_best_weights=True) 

history_cb = model_dropout.fit(train_scaled, train_target, epochs=20, verbose=0,
                        validation_data=(val_scaled, val_target),
                        callbacks=[checkpoint_cb, early_stopping_cb])

print(f"조기 종료된 에포크: {early_stopping_cb.stopped_epoch}번째")

plt.plot(history_cb.history['loss'], label='train_loss')
plt.plot(history_cb.history['val_loss'], label='val_loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend()
plt.show()




6주차를 마치며

이번 주에는 인공 신경망의 기본 원리부터 시작해서, 심층 신경망을 구축하고 다양한 훈련 기법들(활성화 함수, 옵티마이저, 드롭아웃, 콜백 등)을 적용하는 과정을 거치며 딥러닝의 핵심을 깊이 있게 이해할 수 있었던 시간입니다. 이론적인 학습을 넘어 실제 코드를 통해 구현하고 그 결과를 확인하는 과정에서 많은 것을 배우고 성장할 수 있었습니다. 스터디는 이번주 까지해서 끝이 나지만 교재의 남은 부분과 다른 책들을 참고하면서 더 깊이 있게 공부해 나가겠습니다.




기본 숙제(필수) : Ch.07(07-1) 확인 문제(p.386) 풀고, 설명하기

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

 1,000개
② 1,001개
③ 1,010개
④ 1,100개

정답: 1번. 입력 100개, 뉴런 10개이므로 100 X 10 + 10 = 1,010개 입니다.



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

 ‘binary’
② ‘sigmoid’
③ ‘softmax’
④ ‘relu’

정답: 2번. 이진 분류 모델의 출력층은 Dense(1, activation=’sigmoid’)로 설정합니다. (교재 374p)



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

 configure()
② fit()
③ set()
④ compile()

정답: 4번. 모델 객체를 만든 후 훈련하기 전에 사용할 손실 함수와 측정 지표 등을 지정하는 메서드 입니다. (교재 385p)



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

① ‘sparse_categorical_crossentropy’
② ‘categorical_crossentropy’
③ ‘binary_crossentropy’
④ ‘mean_square_error’

정답: 1번. 정수여서 ‘sparse’이고, 다중 분류여서 ‘categorical_crossentropy’ 이기 때문에 ‘sparse_categorical_crossentropy’ 이다.




추가 숙제(선택) : Ch07(07-2) 확인 문제(p.409 ~ 410) 풀고, 설명 하기

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

 model.add(keras.layers.Dense)
② model.add(keras.layers.Dense(10, activation=’relu’))
③ model.add(keras.layers.Dense, 10, activation=’relu’)
④ model.add(keras.layers.Dense)(10, activation=’relu’)

정답: 2번. ex) model.add(keras.layers.Dense(100, activation=’sigmoid’)) (교재 395p)



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

 Plate
② Flatten
③ Normalize
④ Dense

정답: 2번. 1차원으로 펼칠 때는 Flatten 층을 사용 합니다. (교재 397p)



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

 linear
② sigmoid
③ relu
④ tanh

정답: 3번. 렐루 함수는 이미지 분류 모델의 은닉층에 많이 사용하는 활성화 함수입니다. (교재 408p)



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

① SGD
② Adagrad
③ RMSprop
④ Adam

정답: 1번. SGD는 기본 경사 하강법 옵티마이저 클래스입니다. (교재 408p)



답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다