인공신경망의 구조
다음과 같은 28x28 해상도의 숫자 9의 필기체 이미지가 있다. black은 0, white는 1의 픽셀 값을 가질때 컴퓨터는 이를 1차원 배열로 평탄화하여 입력받는다.
Q. 왜 28x28 이미지를 입력받을 때 784 로 입력받을까요?
A. Fully Connected Network 에는 1차원형태로만 주입이 가능하기 때문 네트워크에 데이터를 주입하기 위해서
CNN, RNN 에서는 데이터 전처리를 어떻게 해줄지를 전처리 기능을 제공하고 마지막에는 Fully Connected Network 를 통과하게 됩니다. 첫번째 레이어가 입력층이고, 마지막 레이어가 0~9의 숫자로 분류해주는 출력층이다. 신경망 내부의 뉴런은 Activation(활성화) 역할을 한다. 학습이 진행되며 레이어가 깊어질수록 이미지의 패턴에 해당하는 feature를 다음 레이어로 전달한다. 각각의 뉴런에서 각기 다른 정보를 활성화할지 결정하여 다음 레이어로 넘긴다.
히든 레이어(은닉층)은 입력된 이미지를 잘게 쪼갠다음 조합하는 과정이라 이해할 수 있다. 첫번째 은닉층에서는 새모이마냥 갈기갈기 찢어둔다면, 두번째 은닉층에서는 원, 직선 등의 형태가 각각의 뉴런에 있는 셈이다. 두번째 은닉층의 형태를 조합하여 최종적으로 이미지가 어떤 숫자인지 출력층에 반환해준다. 잘게 쪼개서 재조합하는 일련의 과정은 딥러닝이 비정형 데이터를 잘 다룰 수 있는 원인이다.
Q. Fully Connected Network 에는 1차원형태로 네트워크에 데이터를 주입해야 하는데 어떻게 비정형 데이터(표형태가 아니라 이미지, 음성, 텍스트 등)를 잘 다룰까요?
A. 전처리 레이어에서 이미지, 음성, 텍스트 등을 전처리 하는 기능을 따로 제공합니다. => DNN => CNN => RNN 순으로 배울거에요.
레이어의 각각의 뉴런과 다음층의 뉴런을 잇는 신경은 가중치(weight)를 가지고 있다. 가중치가 클수록 뉴런간의 연결이 강해지는 셈이다.
bias의 역할
- 임계값은 보통 활성화 함수(activation function)의 출력기준
- bias는 뉴런이 활성화되려면 가중치의 합이 얼마나
더 높아야 하는지를 알려줍니다
drop out : 일부 보드를 제거하고 사용하는 것
tensorflow
1. 층구성 tf.keras.sequential()
tf.keras.models.Sequential([
tf.keras.Input(),# 입력층
tf.keras.layers.Dense(), #은닉층
tf.keras.layers.Dense() #출력층
])
1) 입력층
- fmnist에서 입력층은
tf.keras.layers.Flatten(input_shape=(28, 28))
이다. - 2차원 배열(28 x 28 픽셀)의 이미지 포맷을 28 * 28 = 784 픽셀의 1차원 배열로 변환한다.
- Flatten 이라는 이름대로, 픽셀의 행을 일렬로 늘린다.
2) 은닉층
- fmnist에서 은닉층은
tf.keras.layers.Dense(128, activation='relu')
이다. - 밀집 연결(densely-connected) 또는 완전 연결(fully-connected) 층이라 한다.
- 해당 코드에 따르면, 128개의 노드(뉴런,
units
)을 가진다. - 활성화 함수는 ReLU다.
3) 출력층
- fmnist에서 출력층은
tf.keras.layers.Dense(10)
이다. - 활성화함수를 지정하지 않으면 소프트맥스(softmax)가 기본값이다.
- 10개의 확률을 반환하고 반환값의 전체 합은 1이다.
2. 활성화 함수 (activation)
활성화 함수는 오류가 났을 때 가장 파악하기 힘든 부분으로, 명시적으로 적어주는 편이 혼란을 줄이는데 도움을 준다.
- ‘linear’ : 그대로 출력(항등함수)
- ‘relu’ : 은닉층에 주로 사용
- ‘sigmoid’ : 이진 분류 문제(출력층)
- ‘softmax’ : 다중 클래스 분류 문제(출력층)
- 출력층 활성화 함수는 complie 에서 지정하는 loss 값에 따라 기본값이 다르다.
참고하면 좋을 블로그
- [Deep Learning] Activation Function 개념 및 종류: sign, tanh, sigmoid, softmax, ReLU, Leaky ReLU
- [딥러닝] 기울기 소실(Vanishing Gradient)의 의미와 해결방법
3. 컴파일 model.compile()
모델을 훈련하기 전 몇가지 설정이 더 필요하다.
1) 손실함수(loss)
- 훈련 중 모델이 얼마나 정확한지 측정한다. 모델을 올바른 방향으로 "조정"하려면 이 함수를 최소화해야 한다.
- 회귀: MAE, MSE,
- 분류: binary_crossentropy(이진분류), categorical_crossentropy(다중분류:one-hot-encoding), sparse_categorical_crossentropy(다중분류: ordinal Encoding)
2) 옵티마이저(optimizer)
- 모델이 인식하는 데이터와 해당 손실 함수를 기반으로 모델이 업데이트되는 방식이다.
- SGD, RMSprop, Adam
3) 매트릭(metrics)
- 훈련 및 테스트 단계를 모니터링하는 데 사용한다.
- 회귀: accuracy, AUC
- 분류: MAE, MSE
# fmnist
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
4. 요약 model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 784) 0
dense (Dense) (None, 128) 100480
dense_1 (Dense) (None, 10) 1290
=================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
_________________________________________________________________
5. 학습 model.fit()
model.fit(train_images, train_labels, epochs=10)
- epoch 의 수가 많을수록 일반적으로 학습 결과가 좋다.
- epoch 이 너무 많으면 오버피팅(과대적합)의 우려가 있고 너무 적으면 언더피팅(과소적합)의 우려가 있으니 적절한 epoch의 값을 찾아야 한다.
'멋쟁이사자처럼 AIS7 > 오늘코드' 카테고리의 다른 글
[1205] 합성곱 신경망 (Convolutional Neural Network, CNN) (0) | 2022.12.05 |
---|---|
[1130] DNN (0) | 2022.11.30 |
[1128] Confusion Matrix, Resampling, Deep Learning (2) | 2022.11.28 |
[1123] 부스팅 3대장과 분류의 평가지표 (0) | 2022.11.23 |
[1116] Boosting Model (0) | 2022.11.16 |
댓글