목록코딩/ML , Deep (13)
영넌 개발로그
변수 이름 지정 class Variable: def __init__(self,data, name=None): if data is not None: if not isinstance(data, np.ndarray): raise TypeError("{}은 지원하지 않습니다.".format(type(data))) self.data = data self.grad = None self.creator = None self.generation = 0 self.name = name ndarray 인스턴스 변수 Variable을 ndarray 처럼 보이도록 만들기 class Variable: ... @property def shape(self): return self.data.shape @property def ndim(..
파이썬은 필요 없어진 객체를 메모리에서 자동으로 삭제함 -> 메모리 관리 의식x 파이썬이 메모리 관리 하는 방법 1. 참조 카운트 모든 객체는 참조 카운트가 0인 상태로 생성됨 다른 객체가 참조할 때마다 1씩 증가 대입 연산자를 사용할 때 함수에 인수로 전달할 때 컨테이너 타입 객체(리스트, 튜플, 클래스)에 추가할 때 객체에 대한 참조가 끊길 때마다 1만큼 감소 카운트가 0이 되면 파이썬 인터프리터가 회수 class obj: pass def f(x): print(x) a = obj() #변수에 대입: 카운트 1 f(a) #함수에 전달: 함수 안에서 카운트 2 #함수 완료: 카운트 1 a= None #대입 해제: 카운트 0 a = obj() b = obj() c = obj() a.b = b #a가 b를 ..
올바른 역전파의 경우 D,B,C,A 나 D,C,B,A 순서로 역전파가 일어나야 함 현재 구현한 코드는 위의 그래프의 역전파를 올바르게 해내지 못함 처리할 함수의 후보를 funcs 리스트의 끝에 추가하고 다음에 처리할 함수를 그 리스트에서 '마지막' 원소를 꺼내고 있음 처리 순서가 D,C,A,B,A 로 C다음 A가 바로 이어지며 A의 역전파가 두 번 일어나게 된다. 문제 해결을 위해 '우선순위'가 필요 1. 계산 그래프를 분석하여 위상 정렬 알고리즘 사용 (Topological Sort) 노드의 연결 방법을 기초로 노드 정렬 가능 2. 순전파 때 어떤 함수가 어떤 변수를 만들어내는지 알 수 있음 세대 기록 가능 class Variable: def __init__(self,data): if data is n..
입출력 변수가 여러개인 경우가 있음 이를 고려하여 가변 길이 입출력을 처리할 수 있도록 코드 확장하기 순전파 변수들을 리스트에 넣어 처리 class Function: def __call__(self, inputs): xs = [x.data for x in inputs] ys = self.forward(xs) outputs = [Variable[as_array(y)) for y in ys] for output in outputs: output.set_creator(self) self.inputs = inputs self.outputs = outputs return outputs def forward(self, xs): raise NotImplementedError() def backward(self, gy..
파이썬 단위 테스트 표준 라이브러리 unittest 사용 unittest와 TestCase를 상속한 클래스를 구현하고 test 메소드 생성 테스트 케이스가 많아질수록 테스트 하는 함수의 신뢰도 상승 import unittest import deep def numerical_diff(f, x, eps=1e-4): x0 = deep.Variable(x.data - eps) x1 = deep.Variable(x.data + eps) y0 = f(x0) y1 = f(x1) return (y1.data - y0.data) / (2 * eps) class SquareTest(unittest.TestCase): def test_forward(self): x = deep.Variable(np.array(2.0)) y ..
개인 공부용 포스팅 1. square, exp 클래스를 함수화 함수를 파이썬 클래스로 정의하여 사용하다보니 인스턴스를 생성 후 호출하는 두 단계로 구분해 진행했어야 한다. 따라서 두 행동을 한번에 해주는 함수 생성 (square, exp) def square(x): return Square()(x) def exp(x): return Exp()(x) #-------------------------------------------------------------- #위 함수와 같은 의미 def square(x): f = Square() return f(x) #실행코드 x = Variable(np.array(0.5)) y = square(exp(square(x))) y.grad = np.array(1.0) y..
개인 공부용 포스팅 역전파 (backpropagation, 오차역전파법) ? 미분을 효율적으로 계산할 수 있고 결괏값의 오차도 수치 미분보다 작음 연쇄 법칙 (chain rule) 여러 함수를 사슬처럼 연결하여 사용하는 모습을 빗댄 것 연쇄 법칙에 따르면 합성함수의 미분은 구성 함수 각각을 미분한 것과 같음 예시 ) y = F(x) 는 a = A(x), b = B(a), y = C(b) 라는 세 함수로 구성되어 있음 x에 대한 y의 미분은 구성 함수 각각의 미분값을 모두 곱한 값과 같음 합성 함수의 미분은 각 함수의 국소적인 미분들로 분해 가능하다 == 연쇄법칙 dy/dy 는 자신에 대한 미분이라서 항상 1. 생략하는 것이 보통이나 역전파를 구현할 때는 표시하는 게 이해가 편함 역전파 원리 도출 x에 대..
개인 공부 정리를 위한 포스팅 변수 (Variable)? 상자(box) 안에 데이터를 넣는 그림을 상상하기 '상자' 가 변수 - 상자에는 데이터가 들어간다 : 대입 or 할당 - 상자 속을 들여다보면 데이터를 알 수 있다 : 참조 class Variable: def __init__(self, data): self.data = data ex) x는 Variable 인스턴스 / 실제 데이터는 x 안에 x는 데이터 자체가 아니라 데이터를 담은 상자 import numpy as np data = np.array(1.0) x = Variable(data) ####################### x.data = np.array(2.0) 넘파이의 다차원 배열 (텐서, tensor) 숫자 등의 원소가 일정하게 모여..
1. 행렬곱 신경망에서 신호를 전달하는 연산은 행렬곱을 통해 그 크기에 상관없이 간결하게 표현이 가능하다. 또한 많은 컴퓨터 프로그래밍 언어는 행렬을 잘 인식하고 행렬 연산을 빠르고 효율적으로 처리 가능하다. 다음 층으로 넘어갈 때 입력의 합 x = input1 * W1 + input2 * W2 + input3 * W3 이다. 이를 행렬 식으로 나타내 보면 가중치 행렬 * input 행렬을 곱하는 것으로 간단하게 표현이 가능하다. 아래의 수식을 살펴보면 이해가 될 것이다. 위 수식에서 첫번째 행은 다음 계층 첫번째 노드의 활성화 함수에 입력 값으로 전달되고, 두번째 행은 다음 계층 두번째 노드의 활성화 함수에 입력 값으로 전달된다. 2. 역전파 최종적인 행렬곱으로 표현된 역전파 수식을 살펴보자 다중 계층..
다층 신경망의 구조 입력층, 출력층, 은닉층이 있다. 각 층에는 각각 자신만의 특정 함수가 있다. 입력층은 계산을 위한 뉴런은 거의 들어있지 않으며, 출력층은 은닉층에서의 출력 신호이다. 즉, 자극 패턴을 받아 들이고 전체 신경망의 출력 패턴을 정한다. 중요한건 은닉층인데, 은닉층에서는 입력의 특성을 파악해 뉴런의 가중치로 나타낸다. 가중치는 입력 패턴에 숨겨져 있는 특성을 의미한다. 다층 신경망 학습 다층 신경망 학습은 퍼셉트론과 유사하게 진행된다. 신경망은 출력 패턴을 계산하고 오차가 있다면(=실제와 목표 출력 간에 차이가 존재), 이 오차를 줄이도록 가중치를 조절한다. 다층 신경망에서는 가중치가 여러 개인데, 각각의 가중치는 두 개 이상의 출력에 영향을 미친다. 모든 데이터는 행렬로 변환하여 계산한..