Python神经网络学习之5层网络学习多项式回归

实现的效果图:
在这里插入图片描述
神经网络的大致步骤:
1.读取数据集
2.定义网络
3.学习
4.预测
代码区:

"""
功能:多项式回归

"""

from datetime import datetime
from matplotlib import pyplot as plt
import torch
from torch.nn import functional as F
#1.读取数据集
#生成在-1~1之间个数为100的向量
#unsqueeze 是把向量转换为矩阵
x1 = torch.unsqueeze(torch.linspace(-2,2,300),dim =1)
y1 =x1**3 + x1**2+ 0.5*torch.rand(x1.size())
plt.figure()
plt.scatter(x1.data,y1.data,s=20,cmap="autumn")
plt.title("数据集",fontproperties="SimHei")
plt.xlabel("x轴",fontproperties="SimHei")
plt.ylabel("y轴",fontproperties="SimHei")
plt.show()

#2.定义网络
"""
建立回归的神经网络,创建一个类,是数据的前向传导方式,
类继承自torch.nn.Module
"""
class SimpleNet1(torch.nn.Module):
    #定义一个前向传导方式
    def __init__(self,n_feature,n_hidden1,n_hidden2,n_hidden3,n_hidden4,n_output):
        #初始化继承类
        super(SimpleNet1,self).__init__()
        #定义数据传递的前向方式
        self.hidden_1 = torch.nn.Linear(n_feature,n_hidden1)
        self.hidden_2 = torch.nn.Linear(n_hidden1,n_hidden2)
        self.hidden_3 = torch.nn.Linear(n_hidden2,n_hidden3)
        self.hidden_4 = torch.nn.Linear(n_hidden3,n_hidden4)
        self.predict = torch.nn.Linear(n_hidden4,n_output,)

    #定义数据传导过程中数据传导
    def forward(self, x1):
        #定义一个激活函数
        hidden_01 = self.hidden_1(x1)
        x1 =F.sigmoid(hidden_01)

        hidden_02 = self.hidden_2(x1)
        x1 =F.sigmoid(hidden_02)

        hidden_03 = self.hidden_3(x1)
        x1 =F.sigmoid(hidden_03)

        hidden_04 = self.hidden_4(x1)
        x1 =F.sigmoid(hidden_04)

        x1 = self.predict(x1)
        return x1
#3.学习
#实例化网络
net = SimpleNet1(1,100,50,20,10,1)
#print(net) 打印出网络结构

#定义一个优化器
optimizer = torch.optim.SGD(net.parameters(),lr=0.1)
#定义一个损失函数,作为后向传导的基准
func_loss = torch.nn.MSELoss()

#训练网络
#假设循环1000次,查看预测的结果和损失率
d1 = datetime.now()
num_epochs = 10000
for epoch in range(num_epochs):
    prediction = net(x1)
    #loss作为判断
    loss = func_loss(prediction,y1)

    #每一次数据运行的过程
    #forward + backward + optimizer
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    #可视化训练结果
    if (epoch+1)%1000 == 0:
        plt.figure()
        print("Epoch[{}/{},loss:{:.6f},acc:{:.3f}%]".format(epoch+1,num_epochs,loss.data,(1-loss.data)*100)) #格式化输出
        plt.scatter(x1.data.numpy(),y1.data.numpy())
        plt.plot(x1.data.numpy(),prediction.data.numpy(),"r-",lw=5)
        plt.text(0.5,0,"Loss=%.4f"%loss.data,fontdict={"size":20,"color":"green"})
        plt.show()
d2 = datetime.now() 
print("学习的耗时:",d2-d1)
# 4.预测
test_data = torch.tensor([-0.8])
pred = net(test_data)
print(test_data,pred.data)

注:纸上得来终觉浅,绝知此事要躬行。不积跬步,无以至千里;不积小流,无以至江河。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeNet-5神经网络 C源代码,这个写的比较好,可以用gcc编译去跑,结合理论可以对深度学习有更深刻的了解 介绍 根据YANN LECUN的论文《Gradient-based Learning Applied To Document Recognition》设计的LeNet-5神经网络,C语言写成,不依赖任何第三方库。 MNIST手写字符集初代训练识别率97%,多代训练识别率98%。 DEMO main.c文件为MNIST数据集的识别DEMO,直接编译即可运行,训练集60000张,测试集10000张。 项目环境 该项目为VISUAL STUDIO 2015项目,用VISUAL STUDIO 2015 UPDATE1及以上直接打开即可编译。采用ANSI C编写,因此源码无须修改即可在其它平台上编译。 如果因缺少openmp无法编译,请将lenet.c中的#include和#pragma omp parallel for删除掉即可。 API #####批量训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 inputs: 要训练的多个图片对应unsigned char二维数组的数组,指向的二维数组的batchSize倍大小内存空间指针。在MNIST测试DEMO中二维数组为28x28,每个二维数组数值分别为对应位置图像像素灰度值 resMat:结果向量矩阵 labels:要训练的多个图片分别对应的标签数组。大小为batchSize batchSize:批量训练输入图像(二维数组)的数量 void TrainBatch(LeNet5 *lenet, image *inputs, const char(*resMat)[OUTPUT],uint8 *labels, int batchSize); #####单个训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 要训练的图片对应二维数组 resMat:结果向量矩阵 label: 要训练的图片对应的标签 void Train(LeNet5 *lenet, image input, const char(*resMat)[OUTPUT],uint8 label); #####预测 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 输入的图像的数据 labels: 结果向量矩阵指针 count: 结果向量个数 return 返回值为预测的结果 int Predict(LeNet5 *lenet, image input, const char(*labels)[LAYER6], int count); #####初始化 lenet: LeNet5的权值的指针,LeNet5神经网络的核心
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值