본문 바로가기

ML,DL

[DL] 인공 신경망 - 심층 신경망(렐루 함수, Flatten)

2개의 층

from tensorflow.keras.layers import Dense # 층
from tensorflow.keras import Sequential # 모델생성
from tensorflow.keras.datasets import fashion_mnist # 데이터 불러오기
(X_train,y_train),(X_test,y_test) = fashion_mnist.load_data()

# 전처리
X_train_scaled = (X_train / 255.0).reshape(-1,28*28)
X_test_scaled = (X_test / 255.0).reshape(-1,28*28)

이미지의 픽셀값을 0~255 범위에서 0~1 사이로 변환, 28*28 크기의 2차원 배열을 1차원 배열로 펼치기

dense1 = Dense(200, activation='softmax', input_shape=(784,)) #은닉층
dense2 = Dense(10, activation='softmax')

입력층과 출력층 사이에 있는 모든 층 : 은닉층

은닉층의 뉴런 개수 : 출력층의 뉴런보다는 많게 만들어야함

활성화 함수

출력층 : 시그모이드, 소프트맥스 함수로 제한

은닉층 : 비교적 자유로움, 대표적으로 시그모이드 함수와 렐루 함수 사용

심층 신경망 만들기

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

dense1와 dense2 객체를 Sequential 클래스에 추가하여 심층 신경망 만들기

가장 처음 등장하는 은닉층에서 마지막 출력층의 순서로 나열해야 함

model = Sequential() 먼저 만들고 model.add()로 추가 가능

모델 훈련

model.compile(loss='sparse_categorical_crossentropy' ,metrics='acc')
model.fit(X_train_scaled, y_train, validation_split=0.2, epochs=10)

10번의 에포크 동안 훈련시키기

validation_split : 학습 데이터의 일부를 검증(validation) 데이터로 분리, 이 예시에서는 학습 데이터의 20%를 검증 데이터로 사용

성능 확인

model.evaluate(X_test_scaled,y_test)

렐루 함수

초창기 인공 신경망의 은닉층에 많이 사용된 활성화 함수 : 시그모이드 함수

하지만 시그모이드 함수는 오른쪽과 왼쪽 끝으로 갈수록 그래프가 누워있기 때문에 올바른 출력을 만드는데 신속하게 대응하지 못한다.

렐루 함수는 입력이 양수일 경우 마치 활성화 함수가 없는 것처럼 그냥 입력을 통과시키고, 음수일 경우에는 0으로 만든다.

렐루 함수는 심층 신경망에서 뛰어나다.

Flatten 층

Flatten 클래스는 배치 차원을 제외하고 나머지 입력 차원을 모두 일렬로 펼치는 역할만 한다.

따라서 인공 신경망의 성능을 위해 기여하진 않지만, 입력층과 은닉층 사이에 추가하기 때문에 층이라고 부른다.

from tensorflow.keras.layers import Flatten
flatten = Flatten(input_shape=(28,28))
dense1 = Dense(200, activation='relu')
dense2 = Dense(10, activation='softmax')
model = Sequential([
    flatten, dense1, dense2
])
model.summary()

첫 번째 Dense 층에 있던 input_shape 매개변수를 Flatten 층으로 옮겼고, 첫 번째 Dense 층의 활성화 함수를 'relu'로 바꿈

하지만 이 신경망을 깊이가 3인 신경망이라고 부르진 않음 !! Flatten은 학습하는 층이 아니기 때문이다

또한 Flatten 층은 입력값의 차원을 짐작할 수 있다.

입력 데이터에 대한 전처리 과정을 가능한 모델에 포함시키는 것이 케라스 API의 철학 중 하나.

모델 훈련

X_train_scaled = X_train / 255.0
X_test_scaled = X_test / 255.0

여기서는 reshape 메소드를 적용하지 않음

model.compile(loss='sparse_categorical_crossentropy',metrics='acc')
model.fit(X_train_scaled,y_train,validation_split=0.2,epochs=20)

성능 확인

model.evaluate(X_test_scaled, y_test)

은닉층을 추가하지 않은 경우보다 몇 퍼센트 성능이 향상됨

'ML,DL' 카테고리의 다른 글

[DL] SRGAN : 이미지 화질 개선  (0) 2024.05.03
[DL] 인공 신경망 - 단일 신경망  (0) 2024.04.16
[ML] 트리의 앙상블  (1) 2024.04.12
[ML] 확률적 경사 하강법  (0) 2024.04.08
[ML] 로지스틱 회귀 Logistic Regression  (0) 2024.04.08