深度学习_4 数据训练之线性回归

news2024/11/29 1:50:16

训练数据

线性回归

基本原理

比如我们要买房,机器学习深度学习来预测房价。房价的影响因素有:卧室数量,卫生间数量,居住面积。此外,还需要加上偏差值来计算。我们要找到一个正确率高的计算方法来计算。

首先,我们需要有一个计算公式: y = w 1 x 1 + w 2 x 2 + w 3 x 3 + b y=w_1x_1+w_2x_2+w_3x_3+b y=w1x1+w2x2+w3x3+b ,w是权重,b是偏差值。w 和 b 的值需要我们自己选取最优解。

线性模型实现:输入 x 是一个 n*1 的向量,权重 w 是一个 n*1 的向量,b是一个标量。 y = < w , x > + b y=<w,x>+b y=<w,x>+b

这就可以看做一个简单的神经网络了。我们输入多个参数,神经网络处理后最终得到一个标量结果。

1698814961423

神经网络就像级联的神经元一样,每一个神经元是一层,进行一次处理,得到的参数再传递给下一层进行进一步处理。这个例子中层数比较少。

计算得到结果后,如何评价结果的质量?

1698815105842

训练数据:结合计算公式和每次的 loss 反馈,得到 w 和 b 的最优解。

线性回归是一种可以得到显示解(就是确定的解,不像 y=x+C 这种包含未知部分的函数解)的单层神经网络,主要运用加权和偏差对 n 维输入进行处理,通过平方损失来衡量预测值和真实值的差异。

优化方法

具体是用什么样的方法对 w b 进行优化呢?

image-20231101131536440

每次我们沿垂直于切线的方向,也就是求导方向,前进一个步长(学习率),因为沿着这个方向 w 的优化效率最高。

因此很容易联想到学习率步长是有一个合适的范围的,太长了一下子跳太远了。太短了要迭代太多次速度太慢。

另外,重新取点计算梯度值对于复杂模型来说其实是很耗时间的,可能几个小时以上。而且最小值可能不止一个,非要找到损失最小的样本点也很废算力。因此实际操作中一般是随机挑选几个样本点,一部分批量(batch)平均来计算梯度值(小批量随机梯度下降)。batchsize 太小,并行化计算无法完全发挥出来;太大,浪费计算。

实现
%matplotlib inline
import random
import torch
from d2l import torch as d2l

# 生成人造数据集
def synthetic_data(w, b, num_examples):  #@save
    """生成y=Xw+b+噪声"""
    X = torch.normal(0, 1, (num_examples, len(w)))
    y = torch.matmul(X, w) + b
    y += torch.normal(0, 0.01, y.shape)   # 噪声
    return X, y.reshape((-1, 1))         # 列向量,-1 表示行数自己计算应该是多少。 

# 我们人造数据集的参数。训练期望就是得到的 w 和 b 离我们的 true_w true_b 误差很小
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)

# 随机读取一批数据
def data_iter(batch_size, features, labels):
    num_examples = len(features)
    indices = list(range(num_examples))
    # 这些样本是随机读取的,没有特定的顺序
    random.shuffle(indices)
    for i in range(0, num_examples, batch_size):
        batch_indices = torch.tensor(
            indices[i: min(i + batch_size, num_examples)])
        yield features[batch_indices], labels[batch_indices]
        
# 初始化模型参数,批量大小10,初始 wb 如下
batch_size = 10
w = torch.normal(0, 0.01, size=(2,1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)

def linreg(X, w, b):  #@save
    """线性回归模型"""
    return torch.matmul(X, w) + b

def squared_loss(y_hat, y):  #@save
    """均方损失"""
    return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2

def sgd(params, lr, batch_size):  #@save
    """小批量随机梯度下降优化函数"""
    with torch.no_grad():
        for param in params:
            param -= lr * param.grad / batch_size  # 损失函数那里没有归一化,这里归一化
            param.grad.zero_()
            
lr = 0.03			# 学习率
num_epochs = 3		# 优化计算重复3次
net = linreg		# 网络模型
loss = squared_loss	# 损失。这样写后面直接改参数很方便

for epoch in range(num_epochs):
    for X, y in data_iter(batch_size, features, labels):
        l = loss(net(X, w, b), y)  # X和y的小批量损失
        # 因为l形状是(batch_size,1),而不是一个标量。l中的所有元素被加到一起,
        # 并以此计算关于[w,b]的梯度
        l.sum().backward()
        sgd([w, b], lr, batch_size)  # 使用参数的梯度更新参数
    with torch.no_grad():
        train_l = loss(net(features, w, b), labels)
        print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')
  
# output:loss 代表每一次循环 wb 的均方损失
epoch 1, loss 0.038786
epoch 2, loss 0.000152
epoch 3, loss 0.000048

# 和我们自己生成的真正的数据参数比较,来看训练准确性:
print(f'w的估计误差: {true_w - w.reshape(true_w.shape)}')
print(f'b的估计误差: {true_b - b}')
# output:
w的估计误差: tensor([0.0003, 0.0003], grad_fn=<SubBackward0>)
b的估计误差: tensor([-0.0002], grad_fn=<RsubBackward1>)

image-20231101203301587

简洁实现

由于数据迭代器、损失函数、优化器和神经网络层很常用, 现代深度学习库也为我们实现了这些组件。

首先,生成数据集部分是一样的。

import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l

true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = d2l.synthetic_data(true_w, true_b, 1000)

读取数据集不用自己定义一个随机读取函数:

def load_array(data_arrays, batch_size, is_train=True):  #@save
    """构造一个PyTorch数据迭代器"""
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset, batch_size, shuffle=is_train)

batch_size = 10
data_iter = load_array((features, labels), batch_size)

用法可以和前面的复杂实现一样,for X, y in data_iter 。我们也可以用 iter 构造迭代器,用 next 迭代。next(iter(data_iter)) 获取第一项。

模型也可以直接利用深度学习框架预先定义好的层,没有必要自己写。

Sequential 将多个层串联到一起。其实我们这个简单例子只用到了一个层,但是还是使用 Sequential 定义一下来熟悉一波流程。首先我们定义 Sequential 的输入输出,然后给 Sequential 内部具体的层进行配置。

# nn是神经网络的缩写
from torch import nn

net = nn.Sequential(nn.Linear(2, 1))

net[0].weight.data.normal_(0, 0.01)	# 输入层权重参数的正态分布
net[0].bias.data.fill_(0)			# 偏置参数的初始值

损失函数使用 MSELoss L2 范式返回所有样本损失的平均值。

loss = nn.MSELoss()

优化算法:采用小批量优化算法,给定参数和学习率,参数从 net.parameter 中可以直接获取。

trainer = torch.optim.SGD(net.parameters(), lr=0.03)

训练:

num_epochs = 3
for epoch in range(num_epochs):
    for X, y in data_iter:
        l = loss(net(X) ,y)
        trainer.zero_grad()
        l.backward()
        trainer.step()
    l = loss(net(features), labels)
    print(f'epoch {epoch + 1}, loss {l:f}')

误差:

w = net[0].weight.data
print('w的估计误差:', true_w - w.reshape(true_w.shape))
b = net[0].bias.data
print('b的估计误差:', true_b - b)

我的输出:

epoch 1, loss 0.000201

epoch 2, loss 0.000103

epoch 3, loss 0.000103

w的估计误差: tensor([-0.0004, 0.0003])

b的估计误差: tensor([0.0003])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1168477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web3 React dapp中编写balance组件从redux取出并展示用户资产

好啊 上文WEB3 在 React搭建的Dapp中通过redux全局获取并存储用户ETH与自定义token与交易所存储数量中 我们拿到了用户的一个本身 和 交易所token数量 并放进了redux中做了一个全局管理 然后 我们继续 先 起来ganache的一个模拟环境 ganache -d然后 我们启动自己的项目 顺手发…

SaveToDisk属性

大家好&#xff0c;才是真的好。 Domino Designer的帮助文档里面充满了宝藏&#xff0c;最近就发现一个notesitem对象的SaveToDisk属性&#xff0c;你可以设置它为false&#xff0c;这样&#xff0c;虽然文档保存了&#xff0c;但这个字段本身可以不用保存&#xff0c;不仅可以…

激光雷达标定板如何提高激光雷达避免误判的精准度

激光雷达在提高自动驾驶的安全性方面具有重要作用。它通过高精度测量、避免误判、实时感知、适应不同环境和结合其他传感器等方式&#xff0c;为自动驾驶系统提供准确、可靠的感知数据&#xff0c;从而确保行驶的安全性和稳定性。 激光雷达可以通过以下方式避免误判&#xff1a…

测试用例设计方法:正交试验法详解!

01、正交试验法介绍 正交试验法是研究多因素、多水平的一种试验法&#xff0c;它是利用正交表来对试验进行设计&#xff0c;通过少数的试验替代全面试验&#xff0c;根据正交表的正交性从全面试验中挑选适量的、有代表性的点进行试验&#xff0c;这些有代表性的点具备了“均匀…

2023.11.03 homework

小学4年级数学 1 2 3 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 19…

代码随想录算法训练营第四十二天丨 动态规划part05

1049.最后一块石头的重量II 思路 本题其实就是尽量让石头分成重量相同的两堆&#xff0c;相撞之后剩下的石头最小&#xff0c;这样就化解成01背包问题了。 感觉和昨天讲解的416. 分割等和子集 (opens new window)非常像了。 本题物品的重量为 stones[i]&#xff0c;物品的价…

linux环境下编译,安卓平台使用的luajit库

一、下载luajit源码 1、linux下直接下载&#xff1a; a、使用curl下载&#xff1a;https://luajit.org/download/LuaJIT-2.1.0-beta3.tar.gz b、git下载地址&#xff1b;https://github.com/LuaJIT/LuaJIT.git 2、Windows下载好zip文件&#xff0c;下载地址&#xff1a;https…

时空智友企业流程化管控系统文件存在任意文件上传漏洞

时空智友企业流程化管控系统文件存在任意文件上传漏洞 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: app"时空智友V10.1" 漏洞复现1. 构造poc2. 发送数据包&#xff0c;上传文件3. 访问webshellwebshell地址 免责声明 仅用于技术交流,目的是向相关安全人员展示漏…

​ iOS App Store上传项目报错 缺少隐私政策网址(URL)解决方法

一、问题如下图所示&#xff1a; ​ 二、解决办法&#xff1a;使用Google浏览器&#xff08;翻译成中文&#xff09;直接打开该网址 https://www.freeprivacypolicy.com/free-privacy-policy-generator.php 按照要求填写APP信息&#xff0c;最后将生成的网址复制粘贴到隐私…

公安涉密视频会议建设方案

公安涉密视频会议建设方案的制定需要考虑多方面因素。其一般是在复杂涉密网络环境中部署&#xff0c;怎样的内部保密部署方可保障涉密会议最大程度的加密进行呢&#xff1f;以下是从不同维度建设方案&#xff0c;可以根据实际应用场景进行相应的修改以及配置与之匹配的视频会议…

openGauss学习笔记-113 openGauss 数据库管理-设置安全策略-设置帐户安全策略

文章目录 openGauss学习笔记-113 openGauss 数据库管理-设置安全策略-设置帐户安全策略113.1 背景信息113.2 自动锁定和解锁帐户113.2.1 配置failed_login_attempts参数113.2.2 配置password_lock_time参数 113.3 手动锁定和解锁帐户113.4 删除不再使用的帐户 openGauss学习笔记…

【JavaScript】前端一定要看的 Promise 用法详细解析

每一个前端都要学的 Promise 用法详细解析 文章目录 前言一. 认识Promise1.1. 异步回调处理1.2. 什么是Promise1.3. Promise重构 二. Promise对象方法2.1. Executor2.2. then方法 2.2.1. then方法两个参数2.2.2. then方法多次调用2.2.3. then方法的返回值2.3. catch方法2.3.1.…

【教3妹学编程-算法题】2914. 使二进制字符串变美丽的最少修改次数

3妹&#xff1a;呜呜&#xff0c;烦死了&#xff0c; 脸上长了一个痘 2哥 : 不要在意这些细节嘛&#xff0c;不用管它&#xff0c;过两天自然不就好了。 3妹&#xff1a;切&#xff0c;你不懂&#xff0c;影响这两天的心情哇。 2哥 : 我看你是不急着找工作了啊&#xff0c; 工作…

计算两个时间之间连续的日期(java)

背景介绍 给出两个时间&#xff0c;希望算出两者之间连续的日期&#xff0c;比如时间A:2023-10-01 00:00:00 时间B:2023-11-30 23:59:59,期望得到的连续日期为2023-10-01、2023-10-02、… 2023-11-30 Java版代码示例 import java.time.temporal.ChronoUnit; import java.tim…

relectron框架——打包前端vue3、react为pc端exe可执行程序

文章目录 ⭐前言⭐搭建Electron打包环境&#x1f496; npm镜像调整&#x1f496; 初始化项目&#x1f496; 配置index.js ⭐打包vue3⭐打包react⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于使用electronjs打包前端vue3、react成exe可执行程序。…

SpringBoot热部署2023最新版IDEA详细步骤

1、在pom.xml中配置依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency>注意&#xff1a; 依赖放在标签里面 加入依赖后…

『亚马逊云科技产品测评』活动征文|占了个便宜,12个月的免费云服务器

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 在群里看到有小伙伴说亚马逊可以免费试用服务器&#xff0c;这种好事不得…

Android 字体资源

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、 XML 中的字体四…

HTML5+CSS3+JS小实例:简约的黑色分页

实例:简约的黑色分页 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content="…

Vue3问题:如何实现组件拖拽实时预览功能?

前端功能问题系列文章&#xff0c;点击上方合集↑ 序言 大家好&#xff0c;我是大澈&#xff01; 本文约3000字&#xff0c;整篇阅读大约需要5分钟。 本文主要内容分三部分&#xff0c;第一部分是需求分析&#xff0c;第二部分是实现步骤&#xff0c;第三部分是问题详解。 …