[华为可选实验室] 1.线性回归模拟实验

本文目的:

                掌握使用MindSpore进行线性回归

掌握线性回归算法的原理与使用

简介

线性回归(Linear Regression)是机器学习最经典的算法之一,具有如下特点:

  1. 自变量服从正态分布;
  2. 因变量是连续性数值变量;
  3. 自变量和因变量呈线性关系。

本实验主要介绍使用MindSpore在模拟数据上进行线性回归实验,分析自变量和因变量之间的线性关系,即求得一个线性函数。

实验目的

  1. 了解线性回归的基本概念和问题模拟;
  2. 了解如何使用MindSpore进行线性回归实验。

实验环境要求

  1. MindSpore 0.5.0(MindSpore版本会定期更新,本指导也会定期刷新,与版本配套);
  2. 华为云ModelArts(控制台左上角选择“华北-北京四”):ModelArts是华为云提供的面向开发者的一站式AI开发平台,集成了昇腾AI处理器资源池,用户可以在该平台下体验MindSpore。

关于MindSpore可能导入失败导致import mindspore时出问题的情况,可以看这篇文章:

用Anaconda安装后用jupyter notebook敲代码怎么import还是不行? 解决方法-CSDN博客

实验步骤

1.导入MindSpore模块和辅助模块

代码:

import os
# os.environ['DEVICE_ID'] = '0'
import numpy as np


import mindspore as ms
# 从 MindSpore 中导入了 nn 模块,这个模块包含了神经网络相关的类和函数,用于构建深度学习模型。
from mindspore import nn
# 从 MindSpore 中导入了 context 模块,该模块用于设置运行的上下文环境,例如运行模式和设备类型等。
from mindspore import context

# context.set_context() 方法来配置 MindSpore 的执行环境。具体设置了以下两个参数:

# mode=context.GRAPH_MODE:将执行模式设置为图模式,即通过构建计算图进行计算,可以提高性能并适用于生产环境的部署。
# device_target="CPU":指定运行计算图的设备为 CPU,表示计算将在 CPU 上进行。(这个与当初下载MindSpore时选择的有关,我当时下载时候用的是CPU,所以这里选CPU)
context.set_context(mode=context.GRAPH_MODE, device_target="CPU")

2.生成模拟数据

根据线性函数y = -5 * x + 0.1生成模拟数据,并在其中加入少许扰动。

代码:

x = np.arange(-5, 5, 0.3)[:32].reshape((32, 1))
# np.random.normal(loc=0.0, scale=20.0, size=x.shape):生成一个均值为 0,标准差为 20 的随机噪声,并保持与 x 相同的形状。
y = -5 * x +  0.1 * np.random.normal(loc=0.0, scale=20.0, size=x.shape)

 

3.建模

使用MindSpore提供的nn.Dense(1, 1)算子(https://www.mindspore.cn/api/zh-CN/0.2.0-alpha/api/python/mindspore/mindspore.nn.html#mindspore.nn.Dense)作为线性模型,其中(1, 1)表示线性模型的输入和输出皆是1维,即w是1x1的矩阵。算子会随机初始化权重w和偏置b。

y = w * x + b

采用均方差(Mean Squared Error, MSE)作为损失函数。采用随机梯度下降(Stochastic Gradient Descent, SGD)对模型进行优化。

这里创建了一个简单的包含全连接层的神经网络,定义了损失函数、优化器和训练步骤,为后续的模型训练提供了基本的设置。

代码:

# 定义一个简单的全连接神经网络层,其中第一个参数表示输入特征的维度为 1,第二个参数表示输出特征的维度为 1。这里创建了一个具有单个输入和单个输出的全连接层。
net = nn.Dense(1, 1)
# 定义一个均方误差(MSE)损失函数实例
loss_fn = nn.loss.MSELoss()
# 定义一个随机梯度下降(SGD)优化器实例,将该优化器应用于模型 net 的可训练参数(即网络中需要学习的参数),并设置学习率为 0.01。优化器的作用是根据模型的损失函数来更新模型参数,以使损失函数最小化。
opt = nn.optim.SGD(net.trainable_params(), learning_rate=0.01)
# 创建一个带有损失函数的神经网络单元,将网络 net 与损失函数 loss_fn 结合起来。这样可以将输入数据通过网络,计算损失,并且反向传播误差。
with_loss = nn.WithLossCell(net, loss_fn)
# 定义一个训练步骤单元,将带有损失的网络单元 with_loss 和优化器 opt 结合到一起,以实现神经网络的单步训练过程。.set_train 方法用于设置这个训练单元为训练模式。
train_step = nn.TrainOneStepCell(with_loss, opt).set_train()

 

4.使用模拟数据训练模型

代码:

for epoch in range(20):
    # 每个 epoch 中,调用 train_step 函数,传入输入数据 x 和目标数据 y,并返回训练的损失值 loss。这里假设 train_step 函数会完成每个 epoch 的模型训练,并返回当前 epoch 的损失值。
    loss = train_step(ms.Tensor(x, ms.float32), ms.Tensor(y, ms.float32))
    print('epoch: {0}, loss is {1}'.format(epoch, loss))

输出:

epoch: 0, loss is 195.38823
epoch: 1, loss is 140.2429
epoch: 2, loss is 100.98483
epoch: 3, loss is 73.03688
epoch: 4, loss is 53.140587
epoch: 5, loss is 38.976257
epoch: 6, loss is 28.892504
epoch: 7, loss is 21.713715
epoch: 8, loss is 16.602974
epoch: 9, loss is 12.964475
epoch: 10, loss is 10.374076
epoch: 11, loss is 8.529811
epoch: 12, loss is 7.216733
epoch: 13, loss is 6.281809
epoch: 14, loss is 5.6160984
epoch: 15, loss is 5.1420474
epoch: 16, loss is 4.8044405
epoch: 17, loss is 4.563975
epoch: 18, loss is 4.3926663
epoch: 19, loss is 4.2705975

5.使用训练好的模型进行预测

训练一定的代数后,得到的模型已经十分接近真实的线性函数了,使用训练好的模型进行预测。

代码:

# 获取神经网络模型中可训练参数的值(权重和偏置),并将其转换为 NumPy 数组保存在列表 wb 中。
wb = [x.data.asnumpy() for x in net.trainable_params()]
# print(wb)[array([[-4.791694]], dtype=float32), array([0.19500391], dtype=float32)]
# 从参数列表中提取出权重 w 和偏置 b。np.squeeze() 函数用于去除数组中的单维度。
w, b = np.squeeze(wb[0]), np.squeeze(wb[1])
print('The true linear function is y = -5 * x + 0.1')
print('The trained linear model is y = {0} * x + {1}'.format(w, b))

# net(ms.Tensor([[i]], ms.float32)):使用训练好的网络模型对输入 i 进行推断。
# ms.Tensor([[i]], ms.float32) 将输入转换为 MindSpore 的张量数据,然后通过网络得到预测结果。
for i in range(-10, 11, 5):
    print('x = {0}, predicted y = {1}'.format(i, net(ms.Tensor([[i]], ms.float32))))

输出:

The true linear function is y = -5 * x + 0.1
The trained linear model is y = -4.791694164276123 * x + 0.1950039118528366
x = -10, predicted y = [[48.111946]]
x = -5, predicted y = [[24.153475]]
x = 0, predicted y = [[0.19500391]]
x = 5, predicted y = [[-23.763468]]
x = 10, predicted y = [[-47.72194]]

6.可视化

模拟的样本数据、真实的线性函数和训练得到的线性模型,如下图所示:

代码:

from matplotlib import pyplot as plt
plt.scatter(x, y, label='Samples')
plt.plot(x, w * x +  b, c='r', label='True function')
plt.plot(x, -5 * x + 0.1, c='b', label = "Trained model")
plt.legend()

输出:

  • 41
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值