편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2020.06.15

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


    //여기에 코드를 입력하세요
    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
    

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

  • 프로필 dkxm99님의 편집
    날짜2020.06.15

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


    //여기에 코드를 입력하세요
    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
    

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