머신러닝 기초부분 질문드려요

조회수 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

이 클래스가 소프트맥스의 오류역전파 를 구현한거라는데 이것을 제가 짠 코드에 적용 시키고 싶은데 어떻게 추가해야할지를 모르겠습니다. 인터넷에 검색해봐도 이론은 많지만 정작 실제 구현해서 어떤 방식으로 코드에 적용을 시키는지 알려주는곳을 못찾아서 물어봅니다.

  • numpy로 구현하고 계신거라면 밑바닥부터 시작하는 딥러닝 이라는 책에 꽤 자세하게 나와있습니다. 네트워크를 보고 손으로 역전파를 계산할 수 있게 될때까지 이해하지 않으면 구현하기 쉽지 않습니다. 한가지 팁을 드리자면 예시로 올려주신 코드처럼 각 layer를 class로 구현하시는 것이 역전파를 하기 편할 거예요 HIAOAIH 2020.6.15 14:35

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)