데스크탑 환경 

I7-7700K - 32GB RAM - GTX1080 Ti


Windows10 pro



컴터 포맷 후 CUDA 설치를 자꾸 실패해서


시행착오 겪은 후 설치 성공한 과정 기록



1. Anaconda 설치


2. Visual Studio 2017 Community 설치 - 기본 설정으로 진행(C++을 이용한 데스크톱 개발)


3. cuda 9.1 설치 - visual studio integration 항목이 자꾸 실패해서 제외하고 설치 - 이 부분이 제일 문제였음


4. 파이참 설치


5. 파이썬 공식홈페이지 3.6.5 설치 (안해도 될지도.. 잘모름)




이제 아나콘다로 파이토치 가상환경 만들고 파이참에서 코드 작성 가능~

링크: https://pytorch.org/tutorials/beginner/blitz/neural_networks_tutorial.html#define-the-network


Neural Networks


torch.nn 패키지 이용하여 신경망 구성


nn은 autograd에 의해 정의됨


nn.Module 은 레이어들을 포함하며 forward(input) 메소드는 output을 반환함


학습은 주로 다음의 절차를 따름


학습할 파라미터(웨이트)를 갖는 신경망 정의

데이타셋을 인풋으로 반복

인풋을 네트워크 통과시킴

loss 계산(아웃풋이 정답과 얼마나 떨어져있는지)

back propagation

네트워크 웨이트(파라미터)를 다음의 규칙을 주로 이용하여 갱신함:

weight = weight - learning_rate * gradient




Define the network




forward 함수를 정의해야하며 기울기가 계산될 backward 함수는 autograd를 사용하면 자동적으로 정의됨

forward 함수에서는 어떤 텐서 연산도 사용 가능함



학습할 파라미터는 net.parameters()를 호출하면 얻을 수 있음




인풋을 32x32 랜덤인 경우:




Loss Function


nn 패키지에는 로스 함수가 여러개 있음. nn.MSELoss는 mean-squared error를 계산하는 로스함수





.grad_fn 속성을 이용하여 역방향으로 loss를 따라가보면 아래와 같은 게산 그래프를 볼 수 있음


따라서 loss.backward()를 부를때는 모든 그래프는 loss에 의해 미분되어져있고, requires_grad=True인 모든 텐서들은 기울기가 축적된 .grad 텐서를 갖게됨(?) - backward()를 통해 백프로파게이션 한다는 뜻






Backprop


백프로파게이션을 하려면 loss.backward()를 하면 됨


1회 backward를 통해 conv1의 bias의 gradients가 바뀐걸 알수있음




Read Later:

nn 패키지는 다양한 모듈과 로스펑션을 포함하고 있으며 deep neural network의 블록을 형성한다. 리스트는 아래 주소

https://pytorch.org/docs/stable/nn.html




Update the weights


다음의 간단한 파이썬 식을 통해 가능:


learning_rate = 0.01

for f in net.parameters():

f.data.sub_(f.grad.data * learning_rate)


하지만, 신경망을 쓸 때, SGD, Nesterov-SGD, Adam, RMSProp 등의 다양한 갱신 룰을 이용하고 싶다면 이를 위한 패키지인 torch.optim을 이용하면된다



https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html


autograd 패키지는 모든 텐서 연산에 대해 자동으로 미분값을 구해주며


코드에 따라 back propagation이 정의되어 매번 달라질 수 있음


torch.Tensor 클래스에 .requires_grad 를 True로 하면 모든 연산을 추적하며


연산 종료 후 .backward()를 호출하면 자동으로 게산된 gradient들을 반환함


argument는 shape


모든 graient는 .grad 에 축적됨



텐서를 추적하지 않게하려면 .detach()하면 됨



with torch.no_grad(): 는 해당블록을 트래킹하지않음




function 클래스는 매우매우 중요함 


Tensor와 Function 은 서로 밀접하며 연산의 모든 것을 기록함 


각각의 변수는 .grad_fn 속성이 있으며 이는 Tensor를 생성한 Function을 말함(참조함)


유저로부터 생성된 Tensor는 제외함 - 즉, 함수를 이용해 Tensor가 생성되면 그 Tensor는 .grad_fn속성이 있음



requires_grad는 바꿀수있음


a.requires_grad_(bool)



ex)


x 는 2*2 행렬 원소는 전부 1 (xi = 1)    (i는 1,2,3,4)


y 는 2*2 행렬 원소는 전부 2 (yi = xi + 2)


zi = yi^2 * 3 = (xi + 2) ^2 * 3


o = out 텐서 = zi 의 평균 = 1/4 * zi = 3/4 * (xi + 2) ^2


따라서 o를 xi로 미분하면 3/2 * (xi + 2)


위 캡쳐 예에서 xi는 1이므로 4.5가 나옴





참고링크 : https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#getting-started


1. 두 토치 x, y를 더하는 방법 ( x, y는 (5, 3))


x + y


torch.add(x, y)



2. 더한 값을 저장할 토치를 argument로 넘기는 방법


result = torch.empty(5, 3)

torch.add(x, y, out=result) 



3. _를 접미사로 붙인 모든 연산은 해당 텐서의 값을 바꿈

 즉, x.add_(y), x.copy_() , 등은 x를 바꿈


예)


4. 텐서를 resize/reshape 하려면 torch.view 사용:



2018.05.04 오전 10:00 파이토치 설치 및 공부 시작

+ Recent posts