Chainer의 Hello World!
개요
Chainer은 Preferred Networks에서 제공하는 신경망을 위한 기계 학습 프레임워크입니다. 실제로는 기계 학습 일반적으로 범용적으로 사용할 수 있습니다. 넷에서 보이는 샘플은 복잡한 신경망을 사용한 것이 많기 때문에, 우선 Hello World! 적인 프로그램을 써 보았습니다.
Chainer 설치
시험 정도라면 GPU가 필요 없기 때문에,
$ pip install --install-option="--cupy-no-cuda" chainer
그렇다면 좋다고 생각합니다. 버젼 1.22 의 경우, 갑자기 GPU 를 사용하려고 하면 「GPU 의 환경이 없어!」라고 에러가 되었습니다. 위와 같이 Chainer를 다시 설치했는데 잘 갔습니다.
대상 독자
시험 정도라면 GPU가 필요 없기 때문에,
$ pip install --install-option="--cupy-no-cuda" chainer
그렇다면 좋다고 생각합니다. 버젼 1.22 의 경우, 갑자기 GPU 를 사용하려고 하면 「GPU 의 환경이 없어!」라고 에러가 되었습니다. 위와 같이 Chainer를 다시 설치했는데 잘 갔습니다.
대상 독자
2차 함수 최소화 문제
y = x^2
라는 2차 함수의 최소화 문제를 생각해 보겠습니다. 대답은 $ x = 0 $ 일 때 $ y $는 최소가됩니다. 이것을 Chainer에 풀어 봅시다.
quadratic.pyimport numpy as np
import chainer
class Quadratic(chainer.Link):
def __init__(self):
super().__init__(
x=(1)
)
self.x.data = np.array([2], dtype = np.float32)
def fwd(self):
return (self.x * self.x)
model = Quadratic()
optimizer = chainer.optimizers.SGD(lr = 0.1)
optimizer.use_cleargrads()
optimizer.setup(model)
for i in range(80):
model.cleargrads()
y = model.fwd()
y.backward()
print("=== Epoch %d ===" % (i + 1))
print("model.x.data = %f" % model.x.data)
print("y.data = %f" % y.data)
print("model.x.grad = %f" % model.x.grad)
print()
optimizer.update()
이 코드의 간은 optimizer.setup(model)
입니다. 여기에서는 chainer.optimizers.SGD
(확률적 구배 강하법)을 이용하여 함수를 최소화하려고 합니다. chainer.Optimizer 클래스의 setup 메소드는 찻잔 r. 인 k 클래스의 인스턴스를 취합니다.
chainer.Link
클래스를 상속하고 Quadratic
클래스를 만들고 있습니다.
def __init__(self):
super().__init__(
x=(1)
)
self.x.data = np.array([2], dtype = np.float32)
이 부분에서 x=(1)
라는 것은 x 가 1차원 벡터, 즉 스칼라임을 알려줍니다. 그런 다음 x를 2
(32비트 부동 소수점 유형)로 초기화합니다. Chainer 에서는 주로 32 비트 부동 소수점형을 사용하는 것 같습니다. 이 2
라는 숫자는 랜덤한 초기치로, 다른 숫자라도 괜찮습니다.
y = model.fwd()
y.backward()
...
optimizer.update()
이 부분에서는
y = x^2
import numpy as np
import chainer
class Quadratic(chainer.Link):
def __init__(self):
super().__init__(
x=(1)
)
self.x.data = np.array([2], dtype = np.float32)
def fwd(self):
return (self.x * self.x)
model = Quadratic()
optimizer = chainer.optimizers.SGD(lr = 0.1)
optimizer.use_cleargrads()
optimizer.setup(model)
for i in range(80):
model.cleargrads()
y = model.fwd()
y.backward()
print("=== Epoch %d ===" % (i + 1))
print("model.x.data = %f" % model.x.data)
print("y.data = %f" % y.data)
print("model.x.grad = %f" % model.x.grad)
print()
optimizer.update()
def __init__(self):
super().__init__(
x=(1)
)
self.x.data = np.array([2], dtype = np.float32)
y = model.fwd()
y.backward()
...
optimizer.update()
하고 있습니다.
실행하면,
=== Epoch 1 ===
model.x.data = 2.000000
y.data = 4.000000
model.x.grad = 4.000000
=== Epoch 2 ===
model.x.data = 1.600000
y.data = 2.560000
model.x.grad = 3.200000
=== Epoch 3 ===
model.x.data = 1.280000
y.data = 1.638400
model.x.grad = 2.560000
...
=== Epoch 80 ===
model.x.data = 0.000000
y.data = 0.000000
model.x.grad = 0.000000
그리고 $ x = 0 $ (
model.x.data = 0.000000
)에 해가 수렴하고 있는 것을 알 수 있습니다.Chainer 배우는 법
Chainer 를 시작한다면, 우선은 본가의 튜토리얼이 매우 알기 쉽습니다.
Introduction to Chainer
유지의 분에 의한 일본어 번역 도 있습니다 (단, 약간 내용이 오래된 것 같습니다).
Chainer는 본가 문서도 충실하고, 소스 코드도 간결하고 읽기 쉽다고 느꼈습니다. 튜토리얼 → 레퍼런스 매뉴얼 → 소스 코드와 읽어 진행해 나가면 좋은 것이 아닐까요?
Python 언어 자체와 Python 수치 계산 라이브러리 Numpy에 대한 지식도 당연히 필요합니다. 다만, 어느쪽이나 인터넷상에 여러가지 문헌이 있기 때문에, 프로그래밍의 지식이 있는 분이라면 큰 문제는 없을까 생각합니다.
Reference
이 문제에 관하여(Chainer의 Hello World!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/elm200/items/98777cc184437a1f82c6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)