목록코딩 (60)
영넌 개발로그
변수 이름 지정 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) 숫자 등의 원소가 일정하게 모여..
2005년, 리누스 토르발스가 처음 세상에 소개 리눅스 창시자 이기도 하면서 지옥같은 작업 환경에서 벗어나기 위해 만든 시스템 깃으로 할 수 있는 일 1. 버전 관리 (Version Control) 문서를 수정할 때마다 언제 수정했는지, 어떤 것을 변경했는지 편하고 구체적으로 기록하기 위한 버전 관리 시스템 2.백업 (Backup) 현재 컴퓨터에 있는 자료를 다른 컴퓨터에 복제하는 것 보통 별도의 저장 장치를 마련하거나, 드롭박스, 구글 드라이브 등의 인터넷 서비스를 사용 깃허브(Github) : 깃의 원격(온라인) 저장소 3. 협업(Collaboration) 깃허브와 같은 온라인 서비스를 사용하면 여러 사람이 함께 일하기 편함 누가 어느 부분을 어떻게 수정했는지 기록이 남기 때문에 오류 시에도 파악하기..