>  기사  >  백엔드 개발  >  회귀 및 분류를 구현하기 위해 PyTorch에 간단한 신경망을 구축하는 예

회귀 및 분류를 구현하기 위해 PyTorch에 간단한 신경망을 구축하는 예

不言
不言원래의
2018-04-28 10:58:464388검색

이 기사에서는 회귀 및 분류를 구현하기 위해 PyTorch에서 간단한 신경망을 구축하는 예를 주로 소개하고 참고용으로 제공합니다. 함께 살펴보세요

이 글에서는 PyTorch에서 회귀와 분류를 구현하기 위한 간단한 신경망 구축 사례를 소개합니다. 자세한 내용은 다음과 같습니다.

1 . PyTorch 시작하기

1. 설치 방법

PyTorch 공식 웹사이트(http://pytorch.org)에 로그인하면 다음 인터페이스를 볼 수 있습니다:

옵션을 클릭하세요. 위 그림에서 Linux에서 conda 명령을 얻으려면:

conda install pytorch torchvision -c soumith

현재 PyTorch는 아직 Windows가 아닌 MacOS와 Linux만 지원합니다. PyTorch를 설치하면 두 개의 모듈이 설치됩니다. 하나는 torch이고 다른 하나는 torchvision입니다. Torch는 신경망을 구축하는 데 사용되는 기본 모듈입니다. torchvision은 데이터베이스와 직접 사용할 수 있도록 이미 훈련된 신경망이 있는 보조 모듈입니다. 예를 들어 (VGG, AlexNet, ResNet)입니다.

2. Numpy 및 Torch

torch_data = torch.from_numpy(np_data)는 numpy(배열) 형식을 토치(텐서) 형식으로 변환할 수 있습니다. torch_data.numpy()는 토치의 텐서 형식을 numpy의 배열 형식으로 변환할 수 있습니다. Torch의 Tensor와 numpy의 배열은 저장 공간을 공유하므로 하나를 수정하면 다른 것도 수정됩니다.

1차원(1-D) 데이터의 경우 numpy는 행 벡터 형식으로 출력을 인쇄하고, torch는 열 벡터 형식으로 출력을 인쇄합니다.

sin, cos,abs,mean 등과 같은 numpy의 다른 기능은 torch에서도 같은 방식으로 사용될 수 있습니다. numpy에서 np.matmul(data, data)와 data.dot(data)의 행렬 곱셈은 동일한 결과를 산출한다는 점에 유의해야 합니다. torch.mm(tensor, tensor)는 행렬 곱셈 방법이므로 결과는 다음과 같습니다. 행렬, tensor.dot(tensor)는 텐서를 1차원 텐서로 변환한 다음 요소별로 곱하고 합산하여 실수를 얻습니다.

관련 코드:

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( 
  '\nnumpy array:\n', np_data,  
  '\ntorch tensor:', torch_data,  
  '\ntensor to array:\n', tensor2array,  
) # torch数据格式在print的时候前后自动添加换行符 
 
# abs 
data = [-1, -2, 2, 2] 
tensor = torch.FloatTensor(data)  
print( 
  '\nabs', 
  '\nnumpy: \n', np.abs(data),     
  '\ntorch: ', torch.abs(tensor)  
) # 1维的数据,numpy是行向量形式显示,torch是列向量形式显示 
 
# sin 
print( 
  '\nsin', 
  '\nnumpy: \n', np.sin(data),    
  '\ntorch: ', torch.sin(tensor)  
) 
 
# mean 
print( 
  '\nmean', 
  '\nnumpy: ', np.mean(data),   
  '\ntorch: ', torch.mean(tensor)  
) 
 
# 矩阵相乘 
data = [[1,2], [3,4]] 
tensor = torch.FloatTensor(data)  
 
print( 
  '\nmatrix multiplication (matmul)', 
  '\nnumpy: \n', np.matmul(data, data),   
  '\ntorch: ', torch.mm(tensor, tensor)  
) 
 
data = np.array(data) 
print( 
  '\nmatrix multiplication (dot)', 
  '\nnumpy: \n', data.dot(data),    
  '\ntorch: ', tensor.dot(tensor)   
)

3. Variable

PyTorch의 신경망은 Tensor의 모든 작업에 대한 자동 파생 방법을 제공하는 autograd 패키지에서 제공됩니다.

autograd.Variable 이는 이 패키지의 핵심 클래스입니다. 변수는 Tensor를 포함하고 Tensor에 정의된 거의 모든 작업을 지원하는 컨테이너로 이해될 수 있습니다. 작업이 완료되면 .backward()를 호출하여 모든 그래디언트를 자동으로 계산할 수 있습니다. 즉, Variable에 텐서를 배치해야만 역전송, 자동 도출 등의 연산을 신경망에서 구현할 수 있습니다.

원본 텐서는 .data 속성을 통해 접근할 수 있으며, 이 변수의 기울기는 .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:\n', 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:\n', variable.grad) # Variable的梯度 
print('variable.data:\n', variable.data) # Variable的数据 
print(variable.data.numpy()) #Variable的数据的numpy形式

부분 출력 결과:

변수:
변수 포함:
1 2
3 4
[torch.FloatTensor 크기 2x 2]
variable.grad:
다음을 포함하는 변수:
0.5000 1.0000
1.5000 2.0000
[torch.FloatTensor 크기 2x2]
variable.data:
1 2
3 4
[torch.FloatTensor 크기 2x2]
[[ 1. 2.]
[ 3. 4.]]

4. 여기 기능 활성화 기능

Torch의 활성화 기능은 모두 torch.nn.function에 있으며, 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차 함수로 피팅하고 변수에 넣습니다. 신경망 구축을 위해 Net 클래스를 정의하고 torch.nn.Module 클래스를 상속합니다. 입력 뉴런, 은닉층 뉴런, 출력 뉴런의 수에 대한 매개변수는 Net 클래스의 구성 메소드에서 정의되며, Net 상위 클래스의 구성 메소드는 super() 메소드를 통해 얻어지며, 각각의 구조 형태는 다음과 같습니다. Net의 계층은 속성의 형태로 정의됩니다. 정의 Net의 전달() 메소드는 각 계층의 뉴런을 완전한 신경망 전달 경로로 구축합니다.

Net 클래스를 정의한 후 신경망 인스턴스를 정의합니다. Net 클래스 인스턴스는 신경망의 구조 정보를 직접 출력할 수 있습니다. 그런 다음 신경망의 최적화 프로그램과 손실 함수를 정의합니다. 이러한 사항이 정의되면 교육을 시작할 수 있습니다. Optimizer.zero_grad(), loss.backward(), Optimizer.step()은 각각 이전 단계의 업데이트 매개변수 값을 삭제하고, 오류의 역전파를 수행하여 새로운 업데이트 매개변수 값을 계산하고, 계산된 업데이트 값을 net.parameters(). 반복적인 훈련 과정을 반복합니다.

실행 결과:

Net((숨김): 선형(1 -> 10)

 (predict): Linear (10 -> 1)

)

三、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()

神经网络结构部分的Net类与前文的回归部分的结构相同。

需要注意的是,在循环迭代训练部分,out定义为神经网络的输出结果,计算误差loss时不是使用one-hot形式的,loss是定义在out与y上的torch.nn.CrossEntropyLoss(),而预测值prediction定义为out经过Softmax后(将结果转化为概率值)的结果。

运行结果:

Net (

 (hidden): Linear (2 -> 10)

  (out):Linear (10 -> 2)

)

四、补充知识

1. super()函数

在定义Net类的构造方法的时候,使用了super(Net,self).__init__()语句,当前的类和对象作为super函数的参数使用,这条语句的功能是使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上的最大值和该最大值在该维度上的索引值。

相关推荐:

PyTorch快速搭建神经网络及其保存提取方法详解

PyTorch上实现卷积神经网络CNN的方法

위 내용은 회귀 및 분류를 구현하기 위해 PyTorch에 간단한 신경망을 구축하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.