설명: p 94페이지 설명에 의하면 컴퓨터 메모리의 한계로 숫자를 전부 출력해주지 못하고 있습니다.
4. 책 94 페이지에 맨 위에 나온대로 구현 해 봅니다.
import numpy as np
a = np.array( [ 1010, 1000, 990 ] )
print( np.exp(a) ) # [inf inf inf]
이렇게는 수학적으로는 계산이 되는데 컴퓨터로는 계산이 안됩니다.
5. 컴퓨터로 계산 될 수 있도록 다음과 같이 가지고 있는 숫자중에 가장 큰 값으로 각각 빼서 계산합니다.
a = np.array( [ 1010, 1000, 990 ] )
a = np.array( [ 1010, 1000, 990 ] )
def softmax(a):
C = np.max(a) # a 리스트 요소중에서 가장 큰 요소를 C 에 할당
minus = a - C # a 리스트의 각 요소들을 C 로 차감함( 1010-C, 1000-C, 990-C ]
np_exp = np.exp(minus)
return np_exp
print ( softmax(a) )
분모까지 포함해서 구현하면 ?
a = np.array( [ 1010, 1000, 990 ] )
def softmax(a):
C = np.max(a) # a 리스트 요소중에서 가장 큰 요소를 C 에 할당
minus = a - C # a 리스트의 각 요소들을 C 로 차감함( 1010-C, 1000-C, 990-C ]
exp_a=np_exp = np.exp(minus) # 분자식 구현
sum_exp_a = np.sum(exp_a) # 분모식 구현
y = exp_a / sum_exp_a
return y
print ( softmax(a) )
6. 아래의 신경망에 출력층으로 softmax 함수의 결과를 출력하시오
#1. 입력층 구현(0층)
import numpy as np
x = np.array([ 1, 2 ])
#2. 은닉층(1층)
w1 = np.array([ 1, 3, 5, 2, 4, 6 ]).reshape(2,3)
y = np.dot(x, w1)
y # [ 5, 11, 17]
#3. y 값을 sigmoid 함수에 통과 시킵니다.
def sigmoid(x):
return 1 / ( 1 + np.exp(-x) )
y_hat = sigmoid(y)
print(y_hat)
#4. 은닉층(2층)
w2 = np.array([ 3, 4, 5, 6, 7, 8 ]).reshape(3,2)
z = np.dot( y_hat, w2 )
print(z)
#5. z 값을 시그모이드 함수에 통과 시키기
z_hat = sigmoid(z)
print(z_hat)
#6. 출력층 구현(소프트 맥스 함수로 구현)
def softmax(a):
C = np.max(a) # a 리스트 요소중에서 가장 큰 요소를 C 에 할당
minus = a - C # a 리스트의 각 요소들을 C 로 차감함( 1010-C, 1000-C, 990-C ]
exp_a = np.exp(minus) # 분자식 구현
sum_exp_a = np.sum(exp_a) # 분모식 구현
y = exp_a / sum_exp_a
return y
w3 = np.array([ 4, 2, 3, 2 ]).reshape(2,2)
k = np.dot( z_hat, w3 )
k_hat = softmax(k)
print( k_hat ) # [0.9525741 0.0474259]
문제1. 위에서 출력된 k_hat 의 요소들의 합을 출력하시오 !
import numpy as np
np.sum( k_hat ) # 1.0
문제2. 위에서 만든 3층 신경망을 텐썬 플로우로 구현하시오 !
# 1. 신경망에 필요한 모듈을 불러옵니다.
import tensorflow as tf
import numpy as np
from tensorflow.keras.models import Sequential # 신경망 모델 구현
from tensorflow.keras.layers import Dense # 완전 연결 계층
from tensorflow.keras.optimizers import SGD # 경사하강법
from tensorflow.keras.losses import MeanSquaredError # 오차함수
# 2. 입력층 구현 (0층)
x = np.array([1, 2]).reshape(1, 2)
y = np.array([1, 0]).reshape(1, 2) # 정답 데이터 [ 개, 고양이]
# 3. 모델 생성
model = Sequential()
# 4. 신경망 층 구성
model.add(Dense(3, input_shape=(2,), activation='sigmoid')) # 은닉 1층
model.add(Dense(2, activation='sigmoid')) # 은닉 2층
model.add(Dense(2, activation='softmax')) # 출력층
# 5. 모델의 학습 방법 설정하기
model.compile(optimizer=SGD(), # 경사하강법
loss=MeanSquaredError(), # 오차함수_예측값과 정답과의 차이 출력
metrics=['accuracy']) # 정확도 기준으로 학습시킴
# 6. 모델 학습 시키기
model.fit(x, y, epochs=500) # ecochs -> epochs
# 7. 예측값 출력하기
result = model.predict(x) # X -> x (입력 데이터 사용)
print(result)
문제3. 아래의 그림 신경망을 텐써 플로우로 구현하시오.
# 1. 신경망에 필요한 모듈을 불러옵니다.
import tensorflow as tf
import numpy as np
from tensorflow.keras.models import Sequential # 신경망 모델 구현
from tensorflow.keras.layers import Dense # 완전 연결 계층
from tensorflow.keras.optimizers import SGD # 경사하강법
from tensorflow.keras.losses import CategoricalCrossentropy # 분류 문제용 손실 함수
# 2. 입력층 구현 (0층)
x = np.array([1, 2]).reshape(1, 2)
y = np.array([1, 0, 0]).reshape(1, 3) # 정답 데이터 [ 개, 고양이, 새] - 원핫 인코딩
# 3. 모델 생성
model = Sequential()
# 4. 신경망 층 구성
model.add(Dense(5, input_shape=(2,), activation='sigmoid')) # 은닉 1층
model.add(Dense(4, activation='sigmoid')) # 은닉 2층
model.add(Dense(5, activation='sigmoid')) # 은닉 3층
model.add(Dense(3, activation='softmax')) # 출력층 (3개의 클래스를 예측)
# 5. 모델의 학습 방법 설정하기
model.compile(optimizer=SGD(), # 경사하강법
loss=CategoricalCrossentropy(), # 손실 함수 (분류 문제에 적합)
metrics=['accuracy']) # 정확도 기준으로 학습시킴
# 6. 모델 학습 시키기
model.fit(x, y, epochs=500)
# 7. 예측값 출력하기
result = model.predict(x)
print(result)
▣ 3. 11. 손글씨 필기체 데이터 소개
데이터 설명: mnist 데이터는 숫자 0~9까지의 숫자 이미지로 구성되어 있고 훈련 데이터가 6만장, 테스트 데이터가 1만장으로 구성되어 있습니다. 28x28 크기의 회색조 이미지(1채널) 이며 각 픽셀은 0~255 까지의 값을 취합니다.
예제 1. 텐써 플로우를 이용해서 텐써 플로우에 내장된 mnist 데이터를 가져오시오
from tensorflow.keras.datasets import mnist
# MNIST 데이터셋 불러오기
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 데이터셋 크기 출력
print(x_train.shape) # (60000, 28, 28)
print(x_test.shape) # (10000, 28, 28)