当前位置: 首页 > news >正文

1.线性神经网络--线性回归

1.1 从零实现线性回归

import random
import torch
#from d2l import torch as d2l
import matplotlib.pyplot as plt
def train_data_make(batch_size,X,y):num_examples=len(X)idx=list(range(num_examples))#生成0-999random.shuffle(idx)#样本需要打乱for i in range(0,num_examples,batch_size):batch_idx=torch.tensor(idx[i:min(i+batch_size,num_examples)])yield X[batch_idx],y[batch_idx]#生成器语句
def linear_reg(X,w,b):return torch.matmul(X,w)+b
def mse_loss(y_pred,y):return (y_pred-y)**2/2
def sgd(params, lr, batch_size):  with torch.no_grad():for param in params:param -= lr * param.grad / batch_sizeparam.grad.zero_()
#生成数据
def make_data(w,b,num_exmamples):"y=wx+b+e"X=torch.normal(0,1,(num_exmamples,len(w)))y=torch.matmul(X,w)+b y+=torch.normal(0,0.01,y.shape)return X,y.reshape((-1,1))#-1直接推到出模型的大小
#生成训练数据
w1=torch.tensor([2,-3.4])
b1=torch.tensor([4.2])
X,y=make_data(w1,b1,1000)
#初始化参数
batch_size=10
num_epochs=300
lr=0.05
w = torch.normal(0, 0.01, size=(2,1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)for epoch in range(num_epochs):for X,y in train_data_make(batch_size,X,y):loss=mse_loss(linear_reg(X,w,b),y)loss.sum().backward()sgd([w,b],lr,batch_size)with torch.no_grad():trian_loss=mse_loss(linear_reg(X,w,b),y)print(f"epoch {epoch+1}|Loss {float(trian_loss.mean()):.4f}|w:[{float(w[0]):.4f},{float(w[1]):.4f}]|b:[{float(b):.4f}]")print(f'w的估计误差: {w1 - w.reshape(w1.shape)}')
print(f'b的估计误差: {b1- b}')
print(f"最终的线性回归表达式:F(X1,X2)={float(w[0]):.4f}X1{float(w[1]):.4f}X2+{float(b):.4f}")

1.2 简洁实现线性回归

import numpy as np
import torch
from torch.utils import data
import matplotlib.pyplot as plt
def make_data(w,b,num_exmamples):"y=wx+b+e"X=torch.normal(0,1,(num_exmamples,len(w)))y=torch.matmul(X,w)+b y+=torch.normal(0,0.01,y.shape)return X,y.reshape((-1,1))#-1直接推到出模型的大小
def load_data(data_arrays,batch_size,is_Train=True):dataset=data.TensorDataset(*data_arrays)return data.DataLoader(dataset,batch_size,shuffle=is_Train)
##########################################################################################
batch_size=10   
num_epochs=10
w1=torch.tensor([2,-3.4])
b1=torch.tensor([4.2])
X,y=make_data(w1,b1,1000)
dataset=load_data((X,y),batch_size,is_Train=True)
loss=nn.MSELoss()
model=nn.Sequential(nn.Linear(2,1))
model[0].weight.data.normal_(0,0.01)#第一层的w服从正态分布
model[0].bias.data.fill_(0)#第一层的bias赋值为0
optimizer=torch.optim.SGD(model.parameters(),lr=0.05)
###########################################################################################
for epoch in range(num_epochs):for X_train,y_train in dataset:train_loss=loss(model(X_train),y_train)optimizer.zero_grad()train_loss.backward()optimizer.step()all_loss=loss(model(X),y)print(f"epoch {epoch+1}|Loss {float(all_loss):.6f}")
###########################################################################################
wr0=model[0].weight[0,0].item()
wr1=model[0].weight[0,1].item()
b0=model[0].bias[0].item()
print(f'w的估计误差: {w1 - model[0].weight}')
print(f'b的估计误差: {b1- model[0].bias}')
print(f"最终的线性回归表达式:F(X1,X2)={float(wr0):.4f}X1{float(wr1):.4f}X2+{float(b0):.4f}")
http://www.dtcms.com/a/267802.html

相关文章:

  • Windows深色模式助手,定时自动切换
  • 热方程初边值问题解法
  • Qt之修改纯色图片的颜色
  • token设计方案
  • 大话网络协议 - HTTP不同版本的演进及其区别
  • 基于Excel的数据分析思维与分析方法
  • Java poi-tl 使用 word 模板 生成 word
  • 人工智能之数学基础:线性回归算法的矩阵参数求导
  • dubbo源码学习2-dubbo协议源码分析
  • C++:编译QXlsx库过程
  • 咕咚运动启动时弹出广告
  • Go语言--语法基础6--基本数据类型--切片类型
  • 【学习篇】SQL复杂查询学习
  • D3 面试题100道之(61-80)
  • React 英语单词消消乐一款专为英语学习设计的互动式记忆游戏
  • Flink ClickHouse 连接器:实现 Flink 与 ClickHouse 无缝对接
  • Scala 简介
  • 探索实现C++ STL容器适配器:优先队列priority_queue
  • 三维目标检测|Iou3D 代码解读一
  • [Qt] visual studio code 安装 Qt插件
  • AI(学习笔记第四课) 使用langchain进行AI开发 load documents(pdf)
  • excel 工作需要会的
  • C++:编译QCustomPlot源码为链接库
  • 【MoE】Buffer Overflow in Mixture of Experts
  • [netty5: WebSocketFrameEncoder WebSocketFrameDecoder]-源码解析
  • QML与C++交互之创建自定义对象
  • 使用PyTorch实现Softmax回归(Mnist手写数字识别)
  • Altium Designer使用入门(非精通)教程 第二章(原理图绘制)
  • Windows内核并发优化
  • 比较两个csv文件的内容是否一致