[딥러닝] 01. 인공 신경망의 구조(입력층, 은닉층, 출력층)와 함수 용어 설명(keras), 가중치 행렬
2022. 1. 17. 13:31ㆍ딥러닝
목차
인공 신경망 ( ANN(Artificial Neural Networks, 뉴럴넷(Neural-Net) )
구조
- 입력층 ( input )
- dataset에서 출력값(label)에 영향을 끼치는 특성들을 입력받는 층으로 학습의 맨 처음 단계이다.
- 입력된 data(dataset의 feature)들을 은닉층으로 전달한다. -> 신경망의 깊이(층 수)를 셀 때 입력층은 포함하지 않는다.
- 은닉층 ( hidden )
- 입력층에서 전달받은 특성들을 훈련(연산)시키는 층이다.
- 출력층으로 훈련된 데이터를 전달한다.
- 신경망의 외부에서는 이 층에 직접 접근할 수 없다.
= 계산의 결과를 사용자가 볼 수 없기 때문에 ‘은닉층’이라는 이름이 붙었다. - 은닉층이 2개 이상일 때 심층 신경망이라 하고, deep learning으로 볼 수 있다.
- 출력층 ( output )
- 은닉층을 통해 훈련된 예측한 정답을 출력하는 층이다.
- 은닉층에서 받은 데이터의 총 합을 활성화 함수를 통해 변환한다.
- 이진 분류 : sigmoid 함수
- 출력층의 노드 수 : 1 ( 출력되는 값은 0~1로 확률 값 )
- compile에서 loss 함수 : binary_crossentropy
- 다중 분류 : softmax 함수
- 출력층의 노드 수 : 출력값의 특성(feature, class) 수와 동일
- compile에서 loss 함수 : sparse_categorical_crossentropy
- 회귀 ( Regression ) : 일반적으로 활성화 함수를 지정해주지 않음
- 출력층의 노드 수 : 출력값의 특성수와 동일하게 설정
모델링 (keras)
ver 1.
from tensorflow.keras.layers import Dense
model = tf.keras.models.Sequential()
model.add(Dense(64, activation='relu', input_shape=100)) # [입력층]
model.add(Dense(32, activation='relu')) # [은닉층 2]
model.add(Dense(1. activation='sigmoid')) # [출력층]
위의 코드와 같은 내용으로 아래처럼도 쓸 수 있다.
ver 2.
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(64, activation='relu', input_shape=100), # [입력층, 은닉층1]
tf.keras.layers.Dense(32, activation='relu'), # [은닉층 2]
tf.keras.layers.Dense(1, activation='sigmoid') # [출력층]
])
여기서 가중치 행렬의 shape는?
- [입력층]
- input_shape=100 : 데이터의 특성이 100개, 입력층의 노드도 100개
- [입력층]과 [은닉층 1] 사이의 가중치 행렬의 shape : ( 100, 64 )
- [은닉층]
- Dense(64, … : 생성된 노드 개수 64개
- Dense(32, … : 생성된 노드 개수 32개
- [은닉층 1]과 [은닉층 2] 사이의 가중치 행렬의 shape : ( 64, 32 )
- [출력층]
- Dense(1, … : 생성된 노드 개수 1 ( 이진 분류 )
- [은닉층 2]과 [출력층] 사이의 가중치 행렬의 shape : ( 32, 1 )
model.compile(optimizer='sgd',
loss='binary_crossentropy',
metrics=['accuracy'])
history = model.fit(x_train_scaled, y_train, epochs=200)
model.evaluate(x_test_scaled, y_test)
model.save("model_name.h5")
from tensorflow.keras.models import load_model
model = load_model("model_name.h5")
용어
- Sequential : keras에서 layer을 구성하기 위해 사용. model에 Sequential 객체를 불러와서 저장한다.
아래 model.add(~)는 해당 Sequential 객체에 layer을 추가하는 것이다. - Dense
- Dense(128, ... : [은닉층]의 노드 개수 128개
- Flatten : 2차원 이상의 데이터일 때 1차원으로 펴주는 역할을 한다. 만일 데이터가 (4, 4)라면 데이터는 16이 된다.
- .compile : 모델을 컴파일(기계가 이해할 수 있도록 변환), 신경망에서 사용할 optimizer, loss, metrics를 설정
- optimizer : 훈련 과정 중 최적화 함수 설정
- loss : 손실 함수 설정
- metrics : 훈련 모니터링 지표 선택 ( 평가 지표가 된다 )
- .fit : 실제로 신경망 학습이 진행되는 부분
- Epochs : 데이터셋 전체를 반복할 학습 횟수, 총 훈련 횟수
- Iteration : 가중치를 한 번 수정하는 단위
- batch_size : default는 32, 미니 배치 경사 하강법을 사용하고 싶지 않다면 batch_size=None 입력
- validation_data(x_val, y_val) : 검증데이터를 사용하여 훈련이 잘 되고 있는지 보여준다.
모델이 검증 데이터를 학습하지는 않는다.
만일 검증 데이터의 오차(loss)가 낮아지다가 높아지면 과적합(overfitting)의 신호이다. - validation_split : validation_data(..)과 비슷하지만, 학습 데이터에서 일부를 검증데이터로 분리시켜 사용하는 방식이다.
model.filt(X_train, .... , validation_split=0.2) : 학습데이터의 20%를 검증데이터로 사용한다. - verbose : 학습 중 출력되는 문구 설정
- 0 : None
- 1 : 진행 막대(진행도)
- 2 : 미니 배치마다 손실 정보 출력
- # of data = batch_size * iteration
- .evaluate : 모델에 대한 평가
- .predict() : test(임의의 입력)에 대해 예측 = 모델의 출력값 확인
- .save("~.h5") : 모델을 hdf5파일에 저장
- .load_model("~.h5") : 해당 모델을 불러옴
- 그림 1. wikidocs. 02) 인공 신경망(Artificial Neural Network) 훑어보기. https://wikidocs.net/24987
- 그림 2. stackoverflow. What is the role of "Flatten" in keras?. https://stackoverflow.com/questions/43237124/what-is-the-role-of-flatten-in-keras