使用pytorch训练神经网络2-----回归

博主曾经写过一个使用pytorch训练神经网络的博文(使用Pytorch训练神经网络1),在那篇文章里面博主讲解了一个典型的神经网络的训练过程,引用了官方教程中的示例,包括正向传播、损失函数、反向传播和权值更新,都是根据数学公式手动定义的,如果想清晰了解神经网络的结构可以参考一下那篇文章。

本文博主参考了莫烦python的课程,将以一个回归神经网络的例子展示充分利用pytorch中各种函数和功能搭建神经网络的详细过程,这一篇相比上一篇代码会简便许多。
1、首先导入需要的包和模块

import torch
from torch.autograd import Variable
import torch.nn.functional as F

2、定义输入值和目标输出(目标函数)并转化为Variable(可进行自动求导)
输入值和目标输出放在一起组成训练数据集

x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = x ** 2 + torch.rand(x.size())
x, y = Variable(x), Variable(y)

3、定义神经网络结构

class NN(torch.nn.Module):
	##定义输入、隐藏层和输出的结构
	def __init__(self, n_feature, n_hidden, n_output):
		super(NN, self).__init__()
		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))
		x = self.predict(x)
		return x

4、定义自己的神经网络(相当于一个NN类的实例化对象)

net = NN(1101##print(net)可用来查看自己的网络结构

5、定义优化器和损失函数
这里直接调用pytorch里现有的SGD优化算法(需要传入神经网络的参数和学习率)和MSE损失函数

optimizer = torch.optim.SGD(net.parameters, lr=0.5)
loss_func = torch.nn.MSEloss()

6、开始训练(迭代100次)

for epoch in range(100):
	prediction = net(x)
	loss = loss_func(prediction, y)

	optimizer.zero_grad()               #清除梯度
	loss.backward()                     #反向传播
	optimizer.step()                    #优化

经过上述步骤我们就完成了一个简单的神经网络的训练,经过训练的网络可以完成回归任务。
如果想将训练成果可视化可以使用python的matplotlab模块,这里展示一下加上可视化的完整代码:

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)
##unsqueeze:add a dimension in the first dimension
y = x.pow(2) + 0.2 * torch.rand(x.size())
##add some noise to y

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

# plt.scatter(x, y)

##Linear is full connection network, F.relu is the nonlinear activation functon
class NN(torch.nn.Module):
    def __init__(self, n_featuer, n_hidden, n_output):
        super(NN, self).__init__()
        self.hidden = torch.nn.Linear(n_featuer, n_hidden)
        self.predict = torch.nn.Linear(n_hidden, n_output)


    def forward(self, x):
        x = F.relu(self.hidden(x))
        x = self.predict(x)
        return x


net = NN(1, 10, 1)      #set your own net structure
print(net)

plt.ion()                #Turn interactive mode on
plt.show()

##define optimizer and loss function type
optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
loss_func = torch.nn.MSELoss()

for epoch in range(100):
    prediction = net(x)

    loss = loss_func(prediction, y)

    optimizer.zero_grad()               ##clear grad
    loss.backward()                     ##backpropagation
    optimizer.step()                    ##optimize


    if epoch % 5 == 0:
        #plot and show learning process
        plt.cla()
        plt.scatter(x.data.numpy(), y.data.numpy())
        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
        plt.xlim([-1.2, 1.2])
        plt.ylim([-0.2, 1.2])
        plt.text(0.3, 0, 'loss=%.4f' % loss.data, fontdict={'size': 15, 'color': 'red'})
        plt.pause(0.1)

plt.ioff()                  #Turn interactive mode off
plt.show()
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汉德萨姆ys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值