딥러닝 실습
강사: 이숙번님
1. 인공신경망 (Artificial Neural Network: ANN)
: 인간의 신경세포(뉴런)이 연결된 형태를 모방한 모델
1.1. 퍼셉트론(Perceptron)
: 1957년에 제안한 초기 형태의 인공신경망으로 다수의 입력으로부터 하나의 결과를 내보내는 알고리즘
딥러닝의 기원이 되는 알고리즘
- 입력값과 가중치가 곱해져 전달되고, 다수의 신호를 입력받아 0 또는 1의 값을 출력
1.2. 단층 퍼셉트론(Single-Layer Perceptron)
: 입력층(Input Layer)과 출력층(Output Layer) 두 레이어로 이루어진 퍼셉트론.
- 얕은 신경망(Shallow Neural Network)
1.3. 다층 퍼셉트론(MultiLayer Perceptron: MLP)
: 단층 퍼셉트론에서 입력층과 출력층 사이에 층을 추가한 구조
1.4. 심층 신경망(Deep Neural Network)
: 2개 이상의 은닉층이 존재하는 신경망
2. 딥러닝 함수
2.1. 비용함수
: 가설로부터 얻은 예측 값과 실제 값 사이의 차를 비용(Cost), 오차(Error) 또는 손실(Loss)
즉, 가설이 얼마나 잘못되었는지 평가하는 척도
2.2. MSE(Mean Squared Error)
: 예측 값과 실제 값 사이의 평균 제곱 오차
2.3. Binary Cross-Entropy
: 예측 레이블과 실제 레이블 사이의 교차 엔트로피 손실
- 레이블이 2개만 존재할 때(이진 분류) 사용
2.4. Categorical Cross-Entropy
: 다중 분류 손실함수로 one-hot-encoding 된 입력 값을 받아 사용
2.5. Sparse_Categorical_Cross-Entropy
: 다중 분류 손실함수로 정수형 자료로 된 입력 값을 받아 사용
3. 옵티마이저(Optimzier)
: 관계를 가장 잘 모델링하는 가중치 w 와 절편 b를 찾는 것이 목표
4. 활성화 함수(Activation Function)
: 입력층으로부터 입력받은 데이터의 활성 또는 비활성하는데 사용되는 함수
- 입력값에 따른 출력값의 형태를 결정하는 함수
- y = wx + b : 1차 함수
- 딥러닝에서 활성화 함수는 반드시 비선형 함수여야 함.(선형 함수를 사용할 경우, 단층으로 구성한 것과 똑같은 결과가 나오기 때문임.)
- Sigmoid
- 입력 값을 0과 1 사이의 값으로 변환하여 다음 레이어로 전달
- 이진 분류화에 주로 사용
- ReLu
- 0 이하의 값은 다음 레이어에 전달하지 않음.
- 0 이상의 값은 원래 값 그대로를 다음 레이어로 전달
- 회귀 문제와 CNN 학습 시 주로 사용
- Softmax
- n 차원의 입력을 받아, 각 클래스에 속할 확률을 출력
- 입력받은 값을 0~1 사이의 값으로 출력하며, 총 합은 항상 1이어서 확률 비교 시 유용함.
- 다중 클래스 분류에 주로 사용
- Swish
- Swish는 Relu를 대체하기 의해 구글이 고안한 함수
- Sigmoid 함수에 x를 곱한 아주 간단한 형태
- 깊은 레이어를 학습시킬 때 Relu보다 뛰어난 성능을 보여 줌.
- CNN 학습 시 주로 사용
5. 딥러닝 플랫폼: 텐서플로우
5.1. 텐서플로우
: 텐서플로우(Tensorflow)는 머신러닝과 딥러닝을 위한 오픈소스 플랫폼으로 구글의 인공지능 개발부서에서 개발
- 머신러닝과 딥러닝을 위한 플랫폼은 텐서플로, 테아노(theano), 파이토치(pytorch), mxnet, 케라스(keras), 사이킷런(scikit-learn), NLTK 등 여러 종류가 있다.
※ 참고사이트
: 텐서플로우: ensorflow.org
- 학습데이터: MNIST(Modified NationalInstitute of Standards and Technology)
: 미국 인구 조사국에서 수집한 손글씨 숫자 데이터 집합을 기계학습에 적합하도록 수정한 이미지 집합
- 28x28 픽셀 크기의 회색조 이미지
- 0부터 9까지의 손글씨 이미지가 각각 6,000장으로 모두 6만 장
5.2. MNIST 데이터 가져오기
: 읽어들인 데이터는 이미지, 레이블의 묶음으로 되어있음.
- 훈련용 이미지와 레이블, 테스트용 이미지와 레이블로 읽어옴.
# tensorflow와 tf.keras를 임포트
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
# MNIST 데이터를 학습용, 테스트 데이터로 구분하여 읽어옴
mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
print('train_images.shape =', train_images.shape)
print('test_images.shape =', test_images.shape)
print('train_labels.shape =', train_labels.shape)
print('test_labels.shape =', test_labels.shape)
# 결과
train_images.shape = (60000, 28, 28)
test_images.shape = (10000, 28, 28)
train_labels.shape = (60000,)
test_labels.shape = (10000,)
num = train_images[0]
for i in range(28):
for j in range(28):
print('%4d' %(num[i][j]), end='')
print()
# 결과
5.4. MNIST 데이터 그리기
fig = plt.figure()
ax1 = fig.add_subplot(1, 4, 1)
ax2 = fig.add_subplot(1, 4, 2)
ax3 = fig.add_subplot(1, 4, 3)
ax4 = fig.add_subplot(1, 4, 4)
ax1.imshow(train_images[0], cmap='Greys') # 첫 번째 훈련용 데이터
ax2.imshow(train_images[1], cmap='Greys') # 두 번째 훈련용 데이터
ax3.imshow(train_images[2], cmap='Greys') # 세 번째 훈련용 데이터
ax4.imshow(train_images[3], cmap='Greys') # 네 번째 훈련용 데이터
# 결과
- 0에서 255 사이값을 가지는 회색조 이미지의 값의 범위를 0에서 1 사이의 값으로 변환시키는 작업이 필요하다
- 입력값 전처리 : 0에서 1사이의 값으로 입력 데이터를 가공함
train_images, test_images = train_images / 255, test_images / 255
- keras의 Sequential 네트워크 구조
5.5. Flatten() 함수
: keras의 Flatten() 함수는 2차원 데이터를 1차원 객체로 번환함.
- Dense는 학습을 위한 연결을 밀집된(dense) 구조 혹은 완전 연결(fully connected)층으로 한다는 의미임.
6. 인공신경망 학습
: 활성화 함수, 학습을 위한 최적화 함수, 손실 함수, 측정 방법을 정의하는 절차는 훈련을 하기 전에 필요함.
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
- 모델을 점점 더 좋은 상태로 만드는 것을 최적화(optimizer)라고 함.
- 현재 모델의 정답과 실제 정답의 차이가 오차이고 이 오차를 측정하는 것이 손실함수임.(sparse_categorical_crossentropy)
- 모델을 개선하는 최적화 기법으로는 adam을 선택한 것
6.1. 인공신경망의 성능 개선
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(256, activation='relu'),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(64, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=10)
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=0)
print('\n테스트 정확도:', test_acc)
- 학습을 위한 은닉층을 더 깊게 만들기
- 에폭을 증가시키기
- 많은 학습용 데이터를 사용하기
- 하이퍼파라미터 튜닝하기 등의 방법이 있을 수 있다.
7. CNN(Convolutional Neural Network, 합성곱 신경망)
: 이미지를 분류하기 위해 개발된 신경망
- Convolution layer와 Pooling layer의 조합으로 만들어진 모델
- 커널 필터
8. Convolution Layer
: 커널(필터)을 사용하여 특징을 판별하기 위한 레이어
9. Pooling Layer
: Convolution을 거쳐서 나온 activation maps이 있을 때, 이를 이루는 convolution layer를 resizing하여 새로운 layer를 얻는 것
9.1. Max pooling
: 필터를 사용하여 최대값만 추출하는 레이어
참고 데이터셋: Dogs vs. Cats
https://www.kaggle.com/c/dogs-vs-cats/data
출처: AI Hub 교육과정 - WEB+AI (위 내용이 문제가 된다면 댓글에 남겨주세요. 바로 삭제조치하도록 하겠습니다.)
'Programming 개발은 구글로 > 기타 정보' 카테고리의 다른 글
[WEB+AI] 32일차 딥러닝 GoogLeNet (0) | 2024.11.27 |
---|---|
[WEB+AI] 32일차 CNN Models (0) | 2024.11.26 |
[WEB+AI] 30일차 딥러닝 + RNN (0) | 2024.11.22 |
[WEB+AI] 29일차 딥러닝 이미지 학습 및 LeNet5 (1) | 2024.11.21 |
[WEB+AI] 28일차 딥러닝 2/2 (0) | 2024.11.20 |
댓글