본문 바로가기
Programming 개발은 구글로/기타 정보

[WEB+AI] 31일차 딥러닝 실습

by 40대직장인 2024. 11. 25.

딥러닝 실습

 

강사: 이숙번님

 

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 (위 내용이 문제가 된다면 댓글에 남겨주세요. 바로 삭제조치하도록 하겠습니다.)

 

 

 

댓글