pytorch 는 어떻게 네트워크 회전 사다 리 를 인쇄 합 니까

필요:
경사도 인쇄,네트워크 학습 상황 검사

net = your_network().cuda()
def train():
 ...
 outputs = net(inputs)
    loss = criterion(outputs, targets)
    loss.backward()
 for name, parms in net.named_parameters(): 
  print('-->name:', name, '-->grad_requirs:',parms.requires_grad, \
   ' -->grad_value:',parms.grad)
 ...
인쇄 결 과 는 다음 과 같 습 니 다.
name 은 네트워크 매개 변수의 이름 을 표시 합 니 다.parms.requires_grad 는 이 매개 변 수 를 배 울 수 있 는 지,frozen 인지 아 닌 지 를 나타 낸다.parm.grad 에서 이 매개 변수의 경사도 값 을 인쇄 합 니 다.

보충:pytorch 의 경사도 계산
코드 보 세 요~

import torch
from torch.autograd import Variable
x = torch.Tensor([[1.,2.,3.],[4.,5.,6.]])  #grad_fn None
x = Variable(x, requires_grad=True)
y = x + 2
z = y*y*3
out = z.mean()
#x->y->z->out
print(x)
print(y)
print(z)
print(out)
#  :
tensor([[1., 2., 3.],
        [4., 5., 6.]], requires_grad=True)
tensor([[3., 4., 5.],
        [6., 7., 8.]], grad_fn=<AddBackward>)
tensor([[ 27.,  48.,  75.],
        [108., 147., 192.]], grad_fn=<MulBackward>)
tensor(99.5000, grad_fn=<MeanBackward1>)
graph leaves 에 대한 결과 변수 가 스칼라 라면 gradient 는 기본적으로 None 이거 나'torch.Tensor([1.0])'로 지정 합 니 다.
graph leaves 에 대한 결과 변 수 는 벡터 라면 gradient 는 빠 질 수 없습니다.이 벡터 와 같은 위도 의 tensor 라면.

out.backward()
print(x.grad)
#  :
tensor([[3., 4., 5.],
        [6., 7., 8.]])
#   z  x       gradient  :
gradients = torch.Tensor([[2.,1.,1.],[1.,1.,1.]])
z.backward(gradient=gradients)
# z      ,            :L = torch.sum(z*gradient),   L   leaf Variable    
# x  L   
x.grad
#  :
tensor([[36., 24., 30.],
        [36., 42., 48.]])
오류 상황

z.backward()
print(x.grad) 
#  :RuntimeError: grad can be implicitly created only for scalar outputs           
    
x1 = Variable(torch.Tensor([[1.,2.,3.],[4.,5.,6.]])) 
x2 = Variable(torch.arange(4).view(2,2).type(torch.float), requires_grad=True)
c = x2.mm(x1)
c.backward(torch.ones_like(c))
# c.backward()
#RuntimeError: grad can be implicitly created only for scalar outputs
print(x2.grad)
위의 예 에서 out 은 상수 이 므 로 기본적으로 은 변 수 를 만 들 수 있 습 니 다.만약 에 역방향 으로 전파 하 는 것 이 상수 가 아니라면 이 행렬 의 구체 적 인 값 을 알 아야 합 니 다.네트워크 에서 loss 행렬 이 고 방향 으로 전파 하 는 과정 에서 이 귀 일 화 된 손실 곱 하기 경사도 로 각 신경 원 의 인 자 를 업데이트 하 는 것 입 니 다.
한 블 로 그 를 보고 loss=criterion(outputs,labels)대응 loss+=(label[k]-h)*(label[k]-h)/2
바로 loss 를 구 하 는 것 입 니 다.
나 는 반드시 loss 의 구체 적 인 값 을 요구 해 야 한도 값 을 비교 하여 분류 할 수 있 고 비 선형 활성화 함 수 를 통 해 활성화 여 부 를 판단 할 수 있다 고 생각한다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기