PyTorch 에 간단 한 신경 망 을 구축 하여 회귀 와 분 류 를 실현 하 는 예
1.PyTorch 입문
1.설치 방법
PyTorch 홈 페이지 에 접속 하면http://pytorch.org아래 화면 을 볼 수 있 습 니 다.
위 그림 의 옵션 을 선택 하면 Linux 아래 conda 명령 을 받 을 수 있 습 니 다.
conda install pytorch torchvision -c soumith
현재 PyTorch 는 MacOS 와 Linux 만 지원 하고 Windows 는 지원 하지 않 습 니 다.PyTorch 를 설치 하면 두 개의 모듈 을 설치 할 수 있 습 니 다.하 나 는 torch,하 나 는 torchvision,torch 는 메 인 모듈 로 신경 망 을 구축 하 는 데 사 용 됩 니 다.torchvision 은 보조 모듈 이 고 데이터 베이스 가 있 으 며 이미 훈련 된 신경 망 도 있 습 니 다.예 를 들 어(VGG,AlexNet,ResNet).2.Numpy 와 Torch
torch_data = torch.from_numpy(np_data)numpy(array)형식 을 torch(tensor)형식 으로 변환 할 수 있 습 니 다.torch_data.numpy()는 torch 의 tensor 형식 을 numpy 의 array 형식 으로 변환 할 수 있 습 니 다.Torch 의 Tensor 와 numpy 의 array 는 저장 공간 을 공유 하고 하 나 를 수정 하면 다른 하 나 를 수정 할 수 있 습 니 다.
1 차원(1-D)의 데이터 에 대해 numpy 는 행 벡터 로 출력 되 고 torch 는 열 벡터 로 출력 됩 니 다.
기타 예 를 들 어 sin,cos,abs,mean 등 numpy 의 함 수 는 torch 에서 사용 하 는 방법 이 같 습 니 다.주의해 야 할 것 은 numpy 에서 np.matmul(data,data)과 data.dot(data)행렬 을 곱 하면 같은 결 과 를 얻 을 수 있 습 니 다.torch 에서 torch.mm(tensor,tensor)는 행렬 을 곱 하 는 방법 으로 행렬 을 얻 을 수 있 습 니 다.tensor.dot(tensor)는 tensor 를 1 차원 tensor 로 바 꾼 다음 에 요 소 를 곱 한 후에 화 해 를 구 해서 하나의 실 수 를 얻 을 수 있 습 니 다.
관련 코드:
import torch
import numpy as np
np_data = np.arange(6).reshape((2, 3))
torch_data = torch.from_numpy(np_data) # numpy(array) torch(tensor)
tensor2array = torch_data.numpy()
print(
'
numpy array:
', np_data,
'
torch tensor:', torch_data,
'
tensor to array:
', tensor2array,
) # torch print
# abs
data = [-1, -2, 2, 2]
tensor = torch.FloatTensor(data)
print(
'
abs',
'
numpy:
', np.abs(data),
'
torch: ', torch.abs(tensor)
) # 1 ,numpy ,torch
# sin
print(
'
sin',
'
numpy:
', np.sin(data),
'
torch: ', torch.sin(tensor)
)
# mean
print(
'
mean',
'
numpy: ', np.mean(data),
'
torch: ', torch.mean(tensor)
)
#
data = [[1,2], [3,4]]
tensor = torch.FloatTensor(data)
print(
'
matrix multiplication (matmul)',
'
numpy:
', np.matmul(data, data),
'
torch: ', torch.mm(tensor, tensor)
)
data = np.array(data)
print(
'
matrix multiplication (dot)',
'
numpy:
', data.dot(data),
'
torch: ', tensor.dot(tensor)
)
3. VariablePyTorch 의 신경 망 은 autograd 가방 에서 나 왔 고 autograd 가방 은 Tensor 의 모든 조작 에 대한 자동 가이드 방법 을 제공 합 니 다.
autograd.Variable 은 이 가방 의 가장 핵심 적 인 클래스 입 니 다.Variable 을 tensor 가 들 어 있 는 용기 로 이해 할 수 있 습 니 다.Tensor 를 포장 하고 거의 모든 정 의 를 지원 합 니 다.연산 이 완료 되면.backward()를 호출 하여 모든 경사도 를 자동 으로 계산 할 수 있 습 니 다.tensor 를 Variable 에 넣 어야 신경 망 에서 역방향 전달,자동 유도 등 연산 이 가능 하 다 는 것 이다.
속성.data 를 통 해 원본 tensor 에 접근 할 수 있 으 며,이 Variable 에 대한 경사도 는.grad 속성 을 통 해 볼 수 있 습 니 다.
관련 코드:
import torch
from torch.autograd import Variable
tensor = torch.FloatTensor([[1,2],[3,4]])
variable = Variable(tensor, requires_grad=True)
# Variable
print(tensor)
print(variable)
t_out = torch.mean(tensor*tensor) # ^ 2
v_out = torch.mean(variable*variable)
print(t_out)
print(v_out)
v_out.backward() # Variable
# Variable grad 、data numpy
print('variable:
', variable)
# v_out = 1/4 * sum(variable*variable) v_out
# v_out , d(v_out)/d(variable) = 1/4*2*variable = variable/2
print('variable.grad:
', variable.grad) # Variable
print('variable.data:
', variable.data) # Variable
print(variable.data.numpy()) #Variable numpy
부분 출력 결과:variable:
Variable containing:
1 2
3 4
[torch.FloatTensor of size 2x2]
variable.grad:
Variable containing:
0.5000 1.0000
1.5000 2.0000
[torch.FloatTensor of size 2x2]
variable.data:
1 2
3 4
[torch.FloatTensor of size 2x2]
[[ 1. 2.]
[ 3. 4.]]
4.격려 함수 활성화 기능
Torch 의 격려 함 수 는 모두 torch.nn.functional 에 있 습 니 다.relu,sigmoid,tanh,softplus 는 모두 자주 사용 하 는 격려 함수 입 니 다.
관련 코드:
import torch
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt
x = torch.linspace(-5, 5, 200)
x_variable = Variable(x) # x Variable
x_np = x_variable.data.numpy()
# 4 numpy
y_relu = F.relu(x_variable).data.numpy()
y_sigmoid = F.sigmoid(x_variable).data.numpy()
y_tanh = F.tanh(x_variable).data.numpy()
y_softplus = F.softplus(x_variable).data.numpy()
plt.figure(1, figsize=(8, 6))
plt.subplot(221)
plt.plot(x_np, y_relu, c='red', label='relu')
plt.ylim((-1, 5))
plt.legend(loc='best')
plt.subplot(222)
plt.plot(x_np, y_sigmoid, c='red', label='sigmoid')
plt.ylim((-0.2, 1.2))
plt.legend(loc='best')
plt.subplot(223)
plt.plot(x_np, y_tanh, c='red', label='tanh')
plt.ylim((-1.2, 1.2))
plt.legend(loc='best')
plt.subplot(224)
plt.plot(x_np, y_softplus, c='red', label='softplus')
plt.ylim((-0.2, 6))
plt.legend(loc='best')
plt.show()
2.PyTorch 의 귀환 실현전체 코드 먼저 보기:
import torch
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # 1 2
y = x.pow(2) + 0.2 * torch.rand(x.size())
# tensor Variable
x, y = Variable(x), Variable(y)
#plt.scatter(x.data.numpy(), y.data.numpy())
#plt.show()
#
class Net(torch.nn.Module): # torch.nn.Module
def __init__(self, n_feature, n_hidden, n_output):
super(Net, self).__init__() # Net ( )
#
# Net
self.hidden = torch.nn.Linear(n_feature, n_hidden) #
self.predict = torch.nn.Linear(n_hidden, n_output) #
#
def forward(self, x):
x = F.relu(self.hidden(x)) # relu
x = self.predict(x)
return x
#
net = Net(1, 10, 1)
print(net) # net
#
optimizer = torch.optim.SGD(net.parameters(), lr=0.5) #
loss_function = torch.nn.MSELoss() #
#
plt.ion() #
plt.show()
for t in range(300):
prediction = net(x) # x net,
loss = loss_function(prediction, y) # ,
optimizer.zero_grad() #
loss.backward() # ,
optimizer.step() # net.parameters()
#
if (t+1) % 10 == 0:
plt.cla()
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
plt.text(0.5, 0, 'L=%.4f' % loss.data[0], fontdict={'size': 20, 'color': 'red'})
plt.pause(0.1)
먼저 소음 이 있 는 2 차 함수 적합 데 이 터 를 만들어 Variable 에 넣 습 니 다.신경 네트워크 를 구축 하 는 클래스 Net 를 정의 하고 torch.nn.Module 클래스 를 계승 합 니 다.Net 류 의 구조 방법 에 서 는 뉴 런,숨겨 진 층 뉴 런,출력 뉴 런 의 수 를 입력 하 는 매개 변 수 를 정의 하고 슈퍼()방법 으로 Net 부모 류 의 구조 방법 을 얻어 속성 적 인 방식 으로 Net 의 각 층 의 구조 형식 을 정의 합 니 다.Net 의 forward()방법 을 정의 하여 각 층 의 신경 원 을 완전한 신경 망 앞 방향 으로 구축 합 니 다.Net 클래스 를 정의 한 후 신경 망 인 스 턴 스 를 정의 합 니 다.Net 클래스 인 스 턴 스 는 신경 망 의 구조 정 보 를 직접 인쇄 하여 출력 할 수 있 습 니 다.이 어 신경 망 의 최적화 기와 손실 함 수 를 정의 한다.이 정 의 를 내리 면 훈련 을 할 수 있 습 니 다.optimizer.zero_grad(),loss.backward(),optimizer.step()는 각각 이전 단계 의 업데이트 매개 변수 값 을 비우 고 오차 의 역방향 전 파 를 하 며 새로운 업데이트 매개 변수 값 을 계산 하고 계 산 된 업데이트 값 을 net.parameters()에 부여 합 니 다.반복 훈련 과정.
실행 결과:
Net (
(hidden): Linear (1 -> 10)
(predict): Linear (10 -> 1)
)
3.PyTorch 는 간단 한 분 류 를 실현 합 니 다.
전체 코드:
import torch
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt
#
# 2 100 , , y0=0 y1=1 , cat
n_data = torch.ones(100,2)
# torch.normal(means, std=1.0, out=None)
x0 = torch.normal(2*n_data, 1) # tensor tensor ,
y0 = torch.zeros(100)
x1 = torch.normal(-2*n_data, 1)
y1 = torch.ones(100)
x = torch.cat((x0, x1), 0).type(torch.FloatTensor) # ( )
y = torch.cat((y0, y1), 0).type(torch.LongTensor)
# Variable
x, y = Variable(x), Variable(y)
class Net(torch.nn.Module):
def __init__(self, n_feature, n_hidden, n_output):
super(Net, self).__init__()
self.hidden = torch.nn.Linear(n_feature, n_hidden)
self.out = torch.nn.Linear(n_hidden, n_output)
def forward(self, x):
x = F.relu(self.hidden(x))
x = self.out(x)
return x
net = Net(n_feature=2, n_hidden=10, n_output=2)
print(net)
optimizer = torch.optim.SGD(net.parameters(), lr=0.012)
loss_func = torch.nn.CrossEntropyLoss()
plt.ion()
plt.show()
for t in range(100):
out = net(x)
loss = loss_func(out, y) # loss y , softmax
optimizer.zero_grad()
loss.backward()
optimizer.step()
if t % 2 == 0:
plt.cla()
# softmax
# torch.max ,
prediction = torch.max(F.softmax(out), 1)[1] # 1
pred_y = prediction.data.numpy().squeeze()
target_y = y.data.numpy()
plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=pred_y, s=100, lw=0, cmap='RdYlGn')
accuracy = sum(pred_y == target_y)/200 #
plt.text(1.5, -4, 'Accu=%.2f' % accuracy, fontdict={'size': 20, 'color': 'red'})
plt.pause(0.1)
plt.ioff()
plt.show()
신경 망 구조 부분의 넷 류 는 앞의 회귀 부분의 구조 와 같다.주의해 야 할 것 은 순환 교체 훈련 부분 에서 out 은 신경 망 의 출력 결과 로 정의 하고 오차 loss 를 계산 할 때 one-hot 형식 을 사용 하 는 것 이 아니 라 loss 는 out 과 y 에 있 는 torch.nn.Cross Entropy Loss()로 정의 하 며 예측 치 prediction 은 out 이 Softmax 를 거 친 후(결 과 를 확률 값 으로 전환)의 결과 로 정의 합 니 다.
실행 결과:
Net (
(hidden): Linear (2 -> 10)
(out):Linear (10 -> 2)
)
보충 지식
1.슈퍼()함수
Net 류 의 구조 방법 을 정의 할 때 슈퍼(Net,self)를 사 용 했 습 니 다.init__()문 구 는 현재 클래스 와 대상 을 슈퍼 함수 의 매개 변수 로 사용 합 니 다.이 문 구 는 Net 류 의 구조 방법 으로 초 클래스(부모 클래스)의 구조 방법 을 얻 게 하 는 기능 입 니 다.Net 류 에 대한 단독 정의 구조 방법 에 영향 을 주지 않 고 Net 류 의 부모 클래스 가 무엇 인지 주목 할 필요 가 없습니다.Net 류 의 부모 클래스 를 수정 하려 면 class 문장의 내용 만 수정 하면 됩 니 다.
2. torch.normal()
torch.normal()은 세 가지 상황 으로 나 눌 수 있 습 니 다.(1)torch.normal(means,std,out=None)에서 means 와 std 는 모두 Tensor 입 니 다.이들 의 모양 은 같 지 않 아 도 되 지만 Tensor 안의 요소 수량 은 같 아야 합 니 다.이에 대응 하 는 요 소 는 출력 된 각 요소 의 평균 값 과 표준 차이 입 니 다.(2)torch.normal(mean=0.0,std,out=None)에서 mean 은 정의 가능 한 float 로 각 요소 가 이 평균 값 을 공유 합 니 다.(3)torch.normal(means,std=1.0,out=None)에서 std 는 정의 가능 한 float 로 각 요소 가 이 표준 차 이 를 공유 합 니 다.
3. torch.cat(seq, dim=0)
torch.cat 는 여러 개의 Tensor 를 조립 하여 연결 할 수 있 으 며,dim 은 어느 차원 에서 조립 할 지 지정 합 니 다.
4. torch.max()
(1)torch.max(input)→ float
input 는 tensor 로 input 의 최대 값 인 float 를 되 돌려 줍 니 다.
(2)torch.max(input,dim, keepdim=True, max=None, max_indices=None) -> (Tensor, LongTensor)
지정 한 차원=dim 의 최대 값 과 이 차원 의 색인 값 을 되 돌려 줍 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
IceVision에서 형식별 데이터를 읽는 방법2021년에 가장 멋있는 물체 검출 프레임워크라고 해도 과언이 아닌 IceVision을 사용해, VOC format과 COCO format의 데이터 세트에 대해 Object Detection을 간단하게 실시하기 위한...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.