当前位置:   article > 正文

Pytorch搭建简单神经网络(一)——回归_pcharm def_init_(self,n_input,n_hidden,n_output):

pcharm def_init_(self,n_input,n_hidden,n_output):

Pytorch是一个开源的Python机器学习库,基于Torch

神经网络主要分为两种类型,分类和回归,下面就自己学习用Pytorch搭建简易回归网络进行分享
首先导入需要用的一些包

import torch
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt
from torch.autograd import Variable
  • 1
  • 2
  • 3
  • 4
  • 5

随机生成一组数据
并加上随机噪声增加数据的复杂性

x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
y = x.pow(3)+0.1*torch.randn(x.size())
  • 1
  • 2

将数据转化成Variable的类型用于输入神经网络

为了更好的看出生成的数据类型,我们采用将生成的数据plot出来

x , y =(Variable(x),Variable(y))

plt.scatter(x.data,y.data)
# 或者采用如下的方式也可以输出x,y
# plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
这里由于x,y都是Variable的类型,需要调用data将其输出出来,直接输出也可以

开始搭建神经网络
以下作为搭建网络的模板,定义类,然后继承nn.Module,再继承自己的超类。

class Net(nn.Module):
    def __init__(self):
        super(self).__init__()
        pass
    def forward(self):
        pass
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

不多说直接搭建网络

为了增加网络的复杂性,网络设置为由两个全连接层组成的隐藏层

class Net(nn.Module):
    def __init__(self,n_input,n_hidden,n_output):
        super(Net,self).__init__()
        self.hidden1 = nn.Linear(n_input,n_hidden)
        self.hidden2 = nn.Linear(n_hidden,n_hidden)
        self.predict = nn.Linear(n_hidden,n_output)
    def forward(self,input):
        out = self.hidden1(input)
        out = F.relu(out)
        out = self.hidden2(out)
        out = F.sigmoid(out)
        out =self.predict(out)

        return out
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

为了方便理解,我来画出这个网络的结构
在这里插入图片描述

net = Net(1,20,1)
print(net)
  • 1
  • 2

简单的网络就搭建好了,通过调用和print可以输出网络的结构
在这里插入图片描述
构建优化目标及损失函数

torch.optim是一个实现了各种优化算法的库。大部分常用的方法得到支持,并且接口具备足够的通用性。为了使用torch.optim,你需要构建一个optimizer对象。这个对象能够保持当前参数状态并基于计算得到的梯度进行参数更新。

为了构建一个Optimizer,你需要给它一个包含了需要优化的参数(必须都是Variable对象)的iterable。然后,你可以设置optimizer的参 数选项,比如学习率,权重衰减,等等。

optimizer = torch.optim.SGD(net.parameters(),lr = 0.1)
loss_func = torch.nn.MSELoss()
  • 1
  • 2

采用随机梯度下降进行训练,损失函数采用常用的均方损失函数,设置学习率为0.1,可以根据需要进行设置,原则上越小学习越慢,但是精度也越高,然后进行迭代训练(这里设置为5000次)

for t in range(5000):
    prediction = net(x)
    loss = loss_func(prediction,y)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

optimizer.zero_grad()意思是把梯度置零,也就是把loss关于weight的导数变成0,即将梯度初始化为零(因为一个batch的loss关于weight的导数是所有sampleloss关于weight的导数的累加和);loss.backward()loss进行反向传播, optimizer.step()再对梯度进行优化,更新所有参数。

动态显示学习过程

 if t%5 ==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, 'Loss = %.4f' % loss.data, fontdict={'size': 20, 'color': 'red'})
        plt.pause(0.05)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

附训练开始及结果图
在这里插入图片描述
在这里插入图片描述
我将网络中的一个激活函数从sigmod激活改成relu激活,将学习率改成了0.01后效果改善了很多

附完整代码

import torch
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt
from torch.autograd import Variable

x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
y = x.pow(3)+0.1*torch.randn(x.size())

x , y =(Variable(x),Variable(y))

# plt.scatter(x,y)
# plt.scatter(x.data,y.data)
# plt.scatter(x.data.numpy(),y.data.numpy())
# plt.show()

class Net(nn.Module):
    def __init__(self,n_input,n_hidden,n_output):
        super(Net,self).__init__()
        self.hidden1 = nn.Linear(n_input,n_hidden)
        self.hidden2 = nn.Linear(n_hidden,n_hidden)
        self.predict = nn.Linear(n_hidden,n_output)
    def forward(self,input):
        out = self.hidden1(input)
        out = F.relu(out)
        out = self.hidden2(out)
        out = F.sigmoid(out)
        out =self.predict(out)

        return out

net = Net(1,20,1)
print(net)

optimizer = torch.optim.SGD(net.parameters(),lr = 0.1)
loss_func = torch.nn.MSELoss()

plt.ion()
plt.show()

for t in range(5000):
    prediction = net(x)
    loss = loss_func(prediction,y)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if t%5 ==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, 'Loss = %.4f' % loss.data, fontdict={'size': 20, 'color': 'red'})
        plt.pause(0.05)

plt.ioff()
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/123499
推荐阅读
相关标签
  

闽ICP备14008679号