ch0nny_log

[빅데이터분석] 딥러닝_6. 2층 신경망 구현하기 본문

빅데이터 분석(with 아이티윌)/deep learning

[빅데이터분석] 딥러닝_6. 2층 신경망 구현하기

chonny 2024. 10. 7. 16:28

■ 2층 신경망 구현하기(수치미분을 이용해서 학습 시키기)

 

신경망 학습의 원리를 이해시키기 위해서 필요한 단원

 신경망 학습을 2가지 방법으로 시킬 수 있습니다.

 

 

1.  수치 미분을 이용한 방법(4장)  
-->  장점:  어떻게 학습되는지 확실히 이해할 수 있음
      단점:  학습이 너무 느리다.

2.  오차 역전파를 이용한 방법(5장)
 --> 장점:  학습이 빠릅니다.
      단점:  신경망 학습의 원리를 이해하기가 어려움

 

 


  지금 현장에서 사용하고 있는 모든 신경망을 오차 역전파를 이용한 방법입니다. 

 


▣ 크로스 엔트로피 오차함수


 * 오차함수란 ?   신경망이 예측한 예측값과 진짜 정답과의 오차를 출력해주는 함수

 * 오차함수의 종류 2가지 ?  

   1. 교차 엔트로피 오차함수(cross entropy error) : 분류 문제를 풀때 사용
   2. 평균 제곱 오차함수(mean squared error) : 수치 예측을 할때 사용       

 

예제

1. 교차 엔트로피 오차함수의 수학식을 확인하시오 !


2. 교차 엔트로피 오차 함수의 원리를 이해하시오


3. 교차 엔트로피 오차 함수를 파이썬으로 생성하시오
def cross_entropy_error(y,t):
    delta = 0.0000001 # 0 은 아닌데 0에 아주 가까운수
    return = np.sum(t* np.log(y + delta)​

설명: 위 식과는 다르게 아주 작은 수인 delta를 y에 더해주는 이유는?
-> y 가 0이 되게 되면 마이너스 무한대가 되기 때문에 마이너스 무한대가 출력되지 않도록 아주 작은 값을 y에 더한 것 입니다.

4. 예측값과 정답을 위해서 만든 교차 엔트로피 함수에 넣고 오차를 출력하시오.
def cross_entropy_error(y,t):
    delta = 0.0000001 # 0 은 아닌데 0에 아주 가까운수
    return -np.sum(t* np.log(y + delta))

y = np.array([0.7, 0.2, 0.1])
t = np.array([1, 0, 0])

print(cross_entropy_error(y,t))​
설명: 0.3566748010815999 값이 0에 가까워 지도록 신경망을 학습시키는 것 입니다.
-> 신경망을 통해서 풀고자 하는 문제가 수치 예측인지 분류인지를 명확하게 알고 있으면 관련한 오차함수만 거기에 맞게 잘 선택하면됩니다.

1. 분류 ---------------> 교차 엔트로피 함수
2. 수치예측-----------> 평균 제곱 오차 함수

 


▣  4.2  평균제곱 오차함수

 

예제

1.   평균 제곱 오차의 함수 식인 식 4.1  을  표시하시오 !  


2.  식 4.1 을 보고 평균제곱 오차함수를 파이썬으로 생성하시오 !  (p113)
def  mean_squared_error( y, t ):
    return  0.5  *  np.sum( ( y - t ) ** 2 )​

 

3. 평균 제곱 오차함수에 다음의 데이터를 입력하고 오차를 출력하시오 !
# 예측값
y = np.array([ 0.1, 0.05, 0.6, 0.05, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0 ] )  # 예측 숫자 2

# 정답
t = np.array([ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ])  # 정답  2

def  mean_squared_error( y, t ):
    return  0.5  *  np.sum( ( y - t ) ** 2 )  

print(  mean_squared_error( y, t ) ) # 0.09250000000000003​

 

지금 진행하고 있는 포트폴리오가 숫자를 예측하는 포트폴리오면 수치를 예측하는 신경망을 만드시면 됩니다. 

4. 보스톤 하우징 집값을 예측하는 신경망을 만드시오 !
import tensorflow  as  tf
import numpy as  np
import random

tf.random.set_seed(777)
np.random.seed(777)
random.seed(777)


#1. 보스톤 하우징 데이터를 불러옵니다. 
from  tensorflow.keras.datasets.boston_housing  import  load_data

(x_train, y_train), (x_test, y_test) = load_data( path='boston_housing.npz', test_split=0.2,
seed=777)

print( x_train.shape)  # (404, 13)
print( y_train.shape)  # (404,)
print( x_test.shape)   # (102, 13)
print( y_test.shape)   # (102,)

#2. 모델을 생성합니다.
from  tensorflow.keras.models   import  Sequential
from  tensorflow.keras.layers     import  Dense 

model = Sequential()

#3. 층을 구성합니다.
model.add( Dense( 64, activation ='relu', input_shape=(13, ) )  )  # 은닉 1층
model.add( Dense( 32, activation = 'relu') )  # 은닉 2층
model.add( Dense(1) )   # 출력층 3층 , 집값 1개가 출력되므로 뉴런 1개만 필요

#4. 모델 학습 방법을 지정합니다.
model.compile( optimizer='adam',   # 경사하강법
                    loss='mse',   #   오차함수
                    metrics=['mae'] )  #오차를 줄이겠금 학습 시키겠다. 

#5. 모델을 훈련 시킵니다. 
model.fit( x_train, y_train, epochs=100)

#6. 예측값을 출력합니다.
result = model.predict( x_test )
result 

#7. 모델의 성능을 확인합니다.  (정답 집값과 예측 집값과의 상관계수)

import   numpy  as  np

a = result.flatten()   # 1차원으로 변경

np.corrcoef(  a, y_test )


4. 상관 계수가 0.8 이상이 되도록 하시오

import tensorflow as tf
import numpy as np
import random
import os

# 모든 랜덤 시드 고정
tf.random.set_seed(777)
np.random.seed(777)
random.seed(777)
os.environ['PYTHONHASHSEED'] = '777'

# GPU 비활성화
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'  # CPU만 사용

# 결정론적 실행을 보장하는 옵션 설정
os.environ['TF_DETERMINISTIC_OPS'] = '1'

# 1. 보스턴 하우징 데이터를 불러옵니다.
from tensorflow.keras.datasets.boston_housing import load_data

(x_train, y_train), (x_test, y_test) = load_data(path='boston_housing.npz', test_split=0.2, seed=777)

# 2. 모델을 생성합니다.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.regularizers import l2

model = Sequential()

# 3. 층을 구성합니다. (더 깊고 정규화된 네트워크)
model.add(Dense(128, activation='relu', input_shape=(13,), kernel_regularizer=l2(0.01)))  # 은닉 1층
model.add(Dropout(0.2))  # 드롭아웃 추가
model.add(Dense(64, activation='relu', kernel_regularizer=l2(0.01)))                      # 은닉 2층
model.add(Dropout(0.2))  # 드롭아웃 추가
model.add(Dense(32, activation='relu', kernel_regularizer=l2(0.01)))                      # 은닉 3층
model.add(Dense(1))  # 출력층

# 4. 모델 학습 방법을 지정합니다.
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),  # 학습률 조정
              loss='mse',  # 평균 제곱 오차
              metrics=['mae'])  # 평균 절대 오차

# 5. 모델을 훈련 시킵니다.
model.fit(x_train, y_train, epochs=200, batch_size=16, validation_split=0.2)

# 6. 예측값을 출력합니다.
result = model.predict(x_test)

# 7. 모델의 성능을 확인합니다. (정답 집값과 예측 집값과의 상관계수)
import   numpy  as  np

a = result.flatten()   # 1차원으로 변경

np.corrcoef(  a, y_test )