머신러닝 기초부분 질문드려요
조회수 559회
//여기에 코드를 입력하세요
import numpy as np
import random
def softmax(xout):
e_xout = np.exp(xout - np.max(xout))
return e_xout / np.sum(e_xout)
def sigmoid(xhidd): '''시그모이드 함수'''
return 1 / (1+np.exp(-xhidd))
def relu(xhidd): '''렐루 함수'''
return np.maximum(0.5, xhidd)
def mse(y,t): '''평균 제곱 오차'''
return np.sum(np.square(y-t))/t.size
def cee(y, t): '''교차 엔트로피 오차'''
dt = 1e-07
return -np.sum(t * np.log(y + dt))
def softmax(x): '''소프트맥스 함수'''
if x.ndim == 2:
x = x.T
x = x - np.max(x, axis=0)
y = np.exp(x) / np.sum(np.exp(x), axis=0)
return y.T
x = x - np.max(x) # 오버플로 대책
return np.exp(x) / np.sum(np.exp(x))
x_in = np.array([0.1, 0.7, 0.3]) '''입력층'''
w_inhidden1 = np.array([[random.random(), random.random(), random.random()], [random.random(), random.random(), random.random()], [random.random(), random.random(), random.random()]]) '''1번째 은닉층 가중치'''
w_inhidden2 = np.array([[random.random(), random.random(), random.random()], [random.random(), random.random(), random.random()], [random.random(), random.random(), random.random()]]) '''2번째 은닉층 가중치'''
w_outhidden = np.array([[random.random(), random.random(), random.random()], [random.random(), random.random(), random.random()], [random.random(), random.random(), random.random()]]) '''3번째 은닉층 가중치'''
t = np.array([0,0,1]) '''정답'''
x_hidd1 = np.dot(x_in, w_inhidden1)
s_hidd1 = sigmoid(x_hidd1)
x_hidd2 = np.dot(s_hidd1, w_inhidden2)
s_hidd2 = sigmoid(x_hidd2)
x_outhidd = np.dot(s_hidd2, w_outhidden)
x_out = softmax(x_outhidd)
print(x_out)
print(mse(x_out, t))
print(cee(x_out, t))
은닉층을 3개 만들고 각각 시그모이드함수를 이용하여 값을 구한다음 마지막에 소프트맥스 함수를 이용하여 정답값인 (t)와 비교하여 평균제곱오차와 교차엔트로피오차를 이용하여 손실률을 구했습니다. 여기서 경사하강과 오류역전파를 적용시키려면 어떻게 해야하나요?
예를 들어
//여기에 코드를 입력하세요
class SoftmasWithLoss:
def __init__(self):
self.loss = None # 손실
self.y = None # softmax의 출력
self.t = None # 정답 레이블(one-hot)
def forward(self, x, t):
self.t = t
self.y = softmax(x)
self.loss = cross_entropy_error(self.y, self.t)
return self.loss
def backward(self, dout=1):
batch_size = self.t.shape[0]
dx = (self.y - self.t) / batch_size
return dx
이 클래스가 소프트맥스의 오류역전파 를 구현한거라는데 이것을 제가 짠 코드에 적용 시키고 싶은데 어떻게 추가해야할지를 모르겠습니다. 인터넷에 검색해봐도 이론은 많지만 정작 실제 구현해서 어떤 방식으로 코드에 적용을 시키는지 알려주는곳을 못찾아서 물어봅니다.
댓글 입력