딥러닝 기초

2024. 6. 20. 18:00Deep Learning

 

✅ Deep Learning

 

✅ Deep Learning 역사

✅ Deep Learning 개념

 

✅ 기계 vs 사람

 

✅ 뉴런의 구조

 

✅ 퍼셉트론

 

 

✅ 시냅스

✅ 퍼셉트론

 

✅ 다층 퍼셉트론

 

✅ 기존 머신러닝(선형모델)과 딥러닝의 공통점

 

✅ 기존 머신러닝(선형모델)과 딥러닝의 차이점

 

✅ 기존 머신러닝(선형모델)과 딥러닝의 선택

 

✅ Deep Learning의 성공요인

✅ 딥러닝 프레임워크

 

✅ 딥러닝 개발 환경 구축

 

 

✅ Google Drive 연동

 

✅ 구글 드라이브 마운트(연동)

from google.colab import drive

drive.mount('/content/drive')
  • 📌 작업 폴더로 이동
%cd /content/drive/MyDrive/Colab Notebooks/Deep Learning

!ls

 

✅ 딥러닝 과정

 

 

 

✅ Keras로 신경망 설계

  • Sequential() : 신경망을 초기화
  • Dense() : 신경망 층을 정의
  • add() : 정의된 신경망 층을 초기화한 신경망에 추가
  • Activation() : 활성화 함수층 정의
  • compile() : 설계된 신경망을 학습할 수 있는 형태로 변환
  • fit() : 학습
  • predict() : 추론
  • evaluate() : 평가

✅ AND 논리 학습 모델을 설계하고 추론

  • 📌 입력 데이터 정의
X = [[0, 0], [0, 1], [1, 0], [1, 1]]
y = [0, 0, 0, 1]
  • 📌 신경망 설계
import numpy as np

np.array(X).shape, np.array(y).shape
# 0번 인덱스 : 데이터의 수
# 1번 인덱스 : 특성의 수 -> input_dim -> 입력의 수

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation

# 신경망 초기화

model1 = Sequential()

# add() : 신경망에 정의된 층을 추가
# Dense() : 신경망 층을 정의
#   - units : 출력의 수 (퍼셉트론 수)
#   - input_dim : 입력의 수 (특성 수) # 2개

model1.add(Dense(units=1, input_dim=2))
model1.add(Activation("sigmoid"))

# summary() : 설계된 신경망의 구조를 출력하는 함수

model1.summary()

 

  • 📌 퍼셉트론 2개로 신경망 설계

model2 = Sequential()

# (1)
# 입력 데이터의 크기 (input_dim)은 첫번째 층에만 정의해주면 된다

model2.add(Dense(units=1, input_dim=2))
model2.add(Activation("sigmoid"))

# (2)

model2.add(Dense(units=1))
model2.add(Activation("sigmoid"))

model2.summary()

 

  • 📌 퍼셉트론 5개로 구성된 신경망

model3 = Sequential()

# (1)

model3.add(Dense(units=4, input_dim=2))
model3.add(Activation("sigmoid"))

# (2)

model3.add(Dense(units=1))
model3.add(Activation("sigmoid"))

model3.summary() # w : 12, b : 5

  • 📌 컴파일
    • loss : 손실함수
      • 회귀 분석 : mse 또는 mean_squard_error
      • 이진 분류 : binary_crossentropy
      • 다진 분류 : categorical_crossentropy
    • optimizer : 최적화 함수 (adam)
    • metrics : 평가 함수 (오차, 정확도)
model1.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
model2.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
model3.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
  • 📌 학습
    • epochs : 학습 반복수
    • batch_size : 학습에 사용할 데이터 수
h1 = model1.fit(X, y, epochs=1000, batch_size=4)

  • 📌 추론
pred = model1.predict([[1, 1]]) # 0.5 보다 크면 -> 1
pred

 

✅ XOR 논리 학습하기

X = [[0, 0], [0, 1], [1, 0], [1, 1]]
y = [0, 1, 1, 0]
model1.fit(X, y, epochs=1000, batch_size=4)

 

model3.fit(X, y, epochs=1000, batch_size=4)

 

✅ 딥러닝 동작 방식 구현해보기

  • (1) 파리미터 초기화 (w, b) - 랜덤
  • (2) 특성 데이터(X)를 입력 -> 예측값 y'를 계산 (y' = wX + b)
  • (3) 오차 계산 : e = y - y'
    • 오차가 크다는 의미는 w, b가 잘못 설정이 된 것 - 오차가 발생한 만큼
    • 예를 들어 w가 10이고 b가 1이면 w가 더 영향을 준 것
    • w의 값은 줄이고 b값은 크게 재조정 -> 오차의 비율만큼
  • (4) 오차에 대한 가중치를 미분 (나누기 - 비율)
  • (5) 가중치 갱신 (미분값을 더해줌)
    • 학습률 : 미분값이 커서 가중치가 너무 크게 변하는 것을 방지
  • 특성 데이터를 넣고 위의 과정을 반복 (오차가 목표값보다 작아질 때까지)

import numpy as np

# X : 특성 데이터, y : 라벨 데이터, epoch : 반복수, lr : 학습률

def fit_user(X, y, epoch, lr) : 
    # (1) w, b 초기화

    w = np.random.randn(1)
    b = np.random.randn(1)

    # (2) ~ (5)까지 epoch만큼 반복

    for i in range(epoch) :
        # (2) 특성 데이터를 입력하여 예측값을 계산

        pred_y = w * X + b

        # (3) 오차 계산 : 실제값 - 예측값
        e = y - pred_y

        # (4) 기울기(경사) 계산 - 미분 -> 경사하강법
        
        dw = e / w
        db = e / b

        # (5) 원 가중치에 학습률을 곱한 기울기 값을 더해서 가중치를 갱신

        w = w + lr * dw
        b = b + lr * db

        # 중간 결과값 출력

        print(f'반복수 : {i}, 예측값 : {pred_y}, 오차 : {e}')

        # 현재 파리미터 (w, b) 값 출력

        # print(f'w : {w}, b : {b}')
fit_user(1, 3, 100, 0.01)

 

✅ 딥러닝 회귀 분석

  • 보스턴 집 값 데이터 셋
from tensorflow.keras.datasets import boston_housing

(X_train, y_train), (X_test, y_test) = boston_housing.load_data()

  • 📌 랜덤값에 대한 seed 설정
    • w, b를 랜덤으로 초기화 -> 신경망을 실행할 때마다 다른 w, b 초기값이 적용
      • 모델 개선 시, 개선 이유가 모델에 의한 것인지 w, b의 초기값에 의한 것인지 구분이 안됨
      • 팀원의 모델을 공유할 때 seed를 설정하지 않으면 공유한 모델을 그대로 적용할 수 없음
import numpy as np
import tensorflow as tf

np.random.seed(1)
tf.random.set_seed(1)
X_train.shape, y_train.shape

  • 📌 신경망 설계

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation

model4 = Sequential()

model4.add(Dense(units=30, input_dim=13)) # input_dim : 특성수
model4.add(Activation("relu"))

# 출력층 (마지막 층)

# units
#   - 회귀모델 : 1
#   - 이진분류 : 1 또는 2 (원핫 인코딩)
#   - 다진분류 : 원핫 인코딩 후의 y 크기

# Activation()
#   - 회귀모델 : linear 또는 생략
#   - 이진모델 : sigmoid 또는 softmax (원핫 인코딩)
#   - 다진모델 : softmax

model4.add(Dense(units=1))

model4.summary()

  • 📌 컴파일
# loss : mse 또는 mean_squard_error
# metrics : 생략 -> loss로 인식

model4.compile(loss="mse", optimizer="adam")
# validation_data : 검증 데이터를 설정 (테스트가 있는 경우)
# validation_split : 해당 비율 만큼을 검증 데이터로 사용 (검증 데이터가 없는 경우)

h4 = model4.fit(X_train, y_train, epochs=200, batch_size=10, validation_data=(X_test, y_test))

  • 📌 시각화 하기
import matplotlib.pyplot as plt

plt.plot(h4.history["loss"], label="loss")
plt.plot(h4.history["val_loss"], label="val_loss")

plt.ylim(0, 200)

plt.legend()

plt.show()

  • 📌 예측하기
pred = model4.predict(X_test)

for i in range(10) :
    print(f'실제값 : {y_test[i]}, 예측값 : {pred[i][0] : .1f}') # : .1f -> 형식 지정

  • 📌 모델 평가
model4.evaluate(X_test, y_test)

  • 📌 이진분류 딥러닝 학습
    • 유방암 데이터 셋
      • 569개 데이터
      • 악성, 양성 라벨
from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()

cancer.keys()

X = cancer.data
y = cancer.target

X.shape, y.shape

import pandas as pd

pd.Series(y).unique()

  • 📌 이진 분류 신경망 모델 설계(라벨을 원핫 인코딩 하지 않는 경우)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation

model5 = Sequential()

# 입력층

model5.add(Dense(units=32, input_dim=30)) 
model5.add(Activation("sigmoid"))

# 은닉층

model5.add(Dense(units=16))
model5.add(Activation("sigmoid"))

# 출력층

model5.add(Dense(units=1))
model5.add(Activation("sigmoid"))

model5.summary()

# 이진 분류 : "binary_crossentropy"

model5.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
# validation_split = 0.2 : 검증 데이터를 훈련 데이터에서 20% 가져다 쓴다

h5 = model5.fit(X, y, epochs=200, batch_size=16, validation_split=0.2)

import matplotlib.pyplot as plt

plt.plot(h5.history["accuracy"], label="accuracy")
plt.plot(h5.history["val_accuracy"], label="val_accuracy")

plt.legend()

plt.show()

plt.plot(h5.history["loss"], label="loss")
plt.plot(h5.history["val_loss"], label="val_loss")

plt.legend()

plt.show()