本文目的:
掌握使用MindSpore进行线性回归
掌握线性回归算法的原理与使用
简介
线性回归(Linear Regression)是机器学习最经典的算法之一,具有如下特点:
- 自变量服从正态分布;
- 因变量是连续性数值变量;
- 自变量和因变量呈线性关系。
本实验主要介绍使用MindSpore在模拟数据上进行线性回归实验,分析自变量和因变量之间的线性关系,即求得一个线性函数。
实验目的
- 了解线性回归的基本概念和问题模拟;
- 了解如何使用MindSpore进行线性回归实验。
实验环境要求
- MindSpore 0.5.0(MindSpore版本会定期更新,本指导也会定期刷新,与版本配套);
- 华为云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()
输出: