深度学习day4-模型

八 手动构建模型实战

1 构建数据集

epoch:使用训练集的全部数据对模型进行一次完整的训练,被称为一代训练

batch:使用训练集中的部分样本对模型权重进行一次反向传播声望参数更新,这部分样本被称为一批数据

iteration:使用一个batch数据对模型进行一次参数更新的过程,被称为一次训练

1 .构建数据集

API
使用 sklearn 的 make_regression 方法来构建一个模拟的回归数据集。
​make_regression 方法的参数解释:- n_samples: 生成的样本数量,决定了数据集的规模。- n_features: 生成的特征数量,决定了数据维度。- noise: 添加到目标变量的噪声标准差,用于模拟真实世界数据的不完美。- coef: 如果为 True, 会返回生成数据的真实系数,用于了解特征与目标变量间的真实关系。- random_state: 随机数生成的种子,确保在多次运行中能够复现相同的结果。
​返回:- X: 生成的特征矩阵。- y: 生成的目标变量。- coef: 如果在调用时 coef 参数为 True,则还会返回真实系数。
def build_data():"""description: 构建数据集"""noise=14.6# 噪声n_samples=1000# 样本数量b=0.5X, y,coef = make_regression(n_samples=n_samples, n_features=4,coef=True,bias=b, noise=noise, random_state=666)X=torch.tensor(X,dtype=torch.float32,requires_grad=True)y=torch.tensor(y,dtype=torch.float32,requires_grad=True)return X, y,coef,b
    

2 .构建数据加载器

将数据分批次加载到模型进行训练

def data_loader(x,y):"""description: 数据加载器"""# 配置参数batch_size = 16#一个批次数量n_samples=x.shape[0]#len(x)n_batches = math.ceil(n_samples / batch_size)#一轮的训练次数indexs=[i for i in range(n_samples)]random.shuffle(indexs)for i in range(0,n_batches):index=indexs[i*batch_size:min((i+1)*batch_size,n_samples)]yield x[index],y[index]if __name__ == "__main__":# 构建数据集X, y, coef = build_dataset()# 分批次记载数据for x, y in data_loader(X, y):print(x, y)

2 模型函数

def myregreser(x,w,b):return x@w+b#一个容器中装的每一条样本的预测值

3 损失函数

def MSE(y_pred,y_true):"""计算均方误差"""return torch.mean((y_pred-y_true)**2)

4 初始化

def initialize(n_features):"""初始化参数"""torch.manual_seed(666)w=torch.randn(n_features,requires_grad=True,dtype=torch.float32)# print(w)b=torch.tensor(14.5,requires_grad=True,dtype=torch.float32)return w,b

5 优化器

def optim_step(w,b,dw,db,lr):# 更新梯度 朝着梯度下降的方向更新梯度值w.data=w.data-lr*dw.datab.data=b.data-lr*db.data

6 训练函数

def train():# 1.生成数据x,y,coef,bais=build_data()# 2.初始化参数w,b=initialize(x.shape[1])# 3.定义训练参数lr=0.01epoch=100for i in range(epoch):e=0count=0for batch_x,batch_y_true in data_loader(x,y):y_batch_pred=myregreser(batch_x,w,b)loss=MSE(y_batch_pred,batch_y_true)e+=losscount+=1# 梯度清零if w.grad is not None:w.data.zero_()if b.grad is not None:b.data.zero_()#反向传播(梯度计算)loss.backward()# 梯度更新optim_step(w,b,w.grad,b.grad,lr)print(f"epoch:{i},loss:{e/count}")return w,b,coef,bais
​
def detect(x,w,b):return torch.matmul(x.type(torch.float32),w)+b
​
if __name__ == '__main__':w,b,coef,bais=train()print(w,b)print(coef,bais)y_pred=detect(torch.tensor([[1,2,3,2],[1,2,3,2]]),w,b)print(y_pred)

九 模型定义组件

1 基本组件

1.损失函数组件

import torch
import torch.nn as nn
import torch.optim as optim
def test001():y_true=torch.tensor([1,2,3,4,5,6],dtype=torch.float32)y_pred=torch.tensor([2,3,4,5,6,7],dtype=torch.float32)loss=nn.MSELoss()#均方误差工具e=loss(y_true,y_pred)#计算损失print(e)

2.线性层组件

def test002():model=nn.Linear(4,1)#w1x1+w2x2+w3x3+w4x4+b=y,隐式操作:w1,w2,w3,w4,b已经初始化过了# print(model.parameters())x=torch.tensor([[1,2,3,4],[1,2,3,4],[1,2,3,4]],dtype=torch.float32)y=model(x)print(y)

3.优化器方法

API:
import torch.optim as optim
- params=model.parameters():模型参数获取;
- optimizer=optim.SGD(params):优化器方法;
- optimizer.zero_grad():梯度清零;
- optimizer.step():参数更新;
def test003():# 一次完整的梯度更新# 1.构建数据集input_x=torch.randint(1,10,(400,5)).type(torch.float32)target=torch.randint(1,10,(400,1)).type(torch.float32)# 2.线性层模型model=nn.Linear(5,1)# 3.优化器对象sgd=optim.SGD(model.parameters(),lr=0.01)# 4.预测y_pred=model(input_x)# 5.损失函数loss_fn=nn.MSELoss()loss=loss_fn(y_pred,target)print(loss)# 6.梯度清零sgd.zero_grad()#等价于w.grad.zero_()# 7.反向传播loss.backward()#1.求损失函数的导函数 2.求梯度# 8.梯度更新sgd.step()# 9.访问更新后的wprint(model.weight)​
if __name__=='__main__':test003()

2 数据加载器

1.构建数据类

需要继承 torch.utils.data.Dataset 并实现以下方法:

①.__init __方法

初始化数据集对象:加载数据或者定义如何从存储中获取数据的路径和方法

def __init__(self, data, labels):self.data = dataself.labels = labels
②.__len__方法

返回样本数量,让Dataloader加载器能够知道数据集的大小

def __len__(self):return len(self.data)
③.__getitem__方法

根据索引返回样本:将从数据集中提取一个样本,并可能对样本进行预处理或变换

def __getitem__(self, index):sample = self.data[index]label = self.labels[index]return sample, label

整体:

import torch
from torch.utils.data import Dataset,DataLoader
class my_dataset(Dataset):def __init__(self,x,y):super(my_dataset,self).__init__()self.data = xself.labels = ydef __getitem__(self, index):return self.data[index],self.labels[index]def __len__(self):return len(self.data)
​
​
if  __name__ == '__main__':# data=my_dataset()==>__init__# len(data)==>__len__# data[1]==>__getitem__x = torch.randn(100, 3)print(x)y = torch.randn(100, 1)# 数据集data=my_dataset(x,y)count=len(data)print(count)print(data[50])
​# 数据加载器loader=DataLoader(data,batch_size=16,shuffle=True)for x,y in loader:print(x.shape,y.shape)
​
​

2.数据加载器

  from torch.utils.data import Dataset,DataLoaderloader=DataLoader(data,batch_size=16,shuffle=True)for x,y in loader:print(x.shape,y.shape)

3 数据集加载案例

1.加载excel数据集

import torch
from torch.utils.data import Dataset,DataLoader
import pandas as pd
class my_excel_dataset(Dataset):def __init__(self,path):super(my_excel_dataset,self).__init__()"""把excel文件读取出来然后想办法把特征值保存到data中把目标值保存到labels中至于如何处理 看实际需求"""data_pd=pd.read_excel(path)data_pd.dropna(axis=1,how='all')data_pd.columns=["zubie","st_id","st_name","fengong","expresion","ppt_make","answer","code_show","score","comments"]data_pd=data_pd.drop(["zubie","st_id","st_name","fengong","comments"],axis=1)# print(data_pd.head())self.data = torch.tensor(data_pd.iloc[:,:-1].to_numpy(),dtype=torch.float32)self.labels = torch.tensor(data_pd.iloc[:,-1].to_numpy(),dtype=torch.float32)​def __getitem__(self, index):return self.data[index],self.labels[index]
​def __len__(self):return len(self.data)​
​
if __name__ == '__main__':data=my_excel_dataset("./data/21级大数据答辩成绩表.xlsx")data_loader=DataLoader(data,batch_size=4,shuffle=True)for x,y in data_loader:print(x,y)

2.加载图片数据集

# import os
"""
os模块的API
"""
# for root,dir,files in os.walk("./data"):
#     print(root,dir,files,"666666666666666")
​
# path=os.path.join("./data","1.png")
# # path="./data"+"/"+"1.png"
# print(path)
​
# 
# _,str=os.path.split("./data/animal/cat")
# print(str)
​
"""
enumerate 生成枚举下标
"""
# x=["20","hello","9999"]
# for i in range(len(x)):
#     print(i,x[i])
# x=["20","hello","9999"]
# for i,el in enumerate(x):
#     print(i,el)

import os
from torch.utils.data import Dataset,DataLoader
import cv2
import torch
# import PIL as Image
class my_image_dataset(Dataset):def __init__(self,path):self.path=pathself.classname=[]self.data=[]self.label=[]for root,dirs,files in os.walk(path):if root==path:self.classname=dirs# print(dirs)# returnelse:for file in files:file_path=os.path.join(root,file)self.data.append(file_path)class_id=self.classname.index(os.path.split(root)[1])self.label.append(class_id)    def __len__(self):return len(self.data)def __getitem__(self, index):img_path=self.data[index]label=self.label[index]img=cv2.imread(img_path)img=cv2.resize(img,(336,336))# print(img.shape)img=torch.from_numpy(img)#HWC 2 CHWimg=img.permute(2,0,1)return img,label# return # pass
if __name__=="__main__":data=my_image_dataset("./data/animal")print(data[500])print(len(data))print(data.classname)train_loader=DataLoader(data,batch_size=32,shuffle=True)for x,y in train_loader:print(x.shape)# x[0]print(y.shape)
​
​
​

3.加载官方数据集

官方地址:Datasets — Torchvision 0.20 documentation

from torch.utils.data import Dataset,DataLoader
from torchvision import transforms,datasets
def test01():transform=transforms.Compose([transforms.ToTensor()])datasets.MNIST(root="./data",train=True,download=True,transform=transform)for x,y in DataLoader(data,batch_size=4,shuffle=True):print(x.shape,y.shape)
​
if __name__ == "__main__":test01()

4 数据增强

提高模型泛化能力(鲁棒性)的一种有效方法,可以模拟更多的训练样本减少过拟合风险

通过torchvision.transforms模块实现,官方提供

1.固定转换

参考:Illustration of transforms — Torchvision 0.20 documentation

2.概率控制转换

3.随机转换

4.数据增强整合

transforms.Compose()

5 重构线性回归

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

菊风视频能力平台开发服务正式入驻华为云云商店,成为华为云联营联运合作伙伴

日前,菊风视频能力平台开发服务正式入驻华为云云商店,成为华为云在实时音视频领域的联营联运合作伙伴。 菊风结合自身产品方案优势与华为云开放、共盈的生态优势强强联手,在推动金融行业数字化转型的路上又向前迈出了一大步。华为云云商店作为…

vue 预览pdf 【@sunsetglow/vue-pdf-viewer】开箱即用,无需开发

sunsetglow/vue-pdf-viewer 开箱即用的pdf插件sunsetglow/vue-pdf-viewer, vue3 版本 无需多余开发,操作简单,支持大文件 pdf 滚动加载,缩放,左侧导航,下载,页码,打印,文本复制&…

Excel如何批量导入图片

这篇文章将介绍在Excel中如何根据某列数据,批量的导入与之匹配的图片。 准备工作 如图,我们准备了一张员工信息表以及几张员工的照片 可以看到,照片名称是每个人的名字,与Excel表中的B列(姓名)对应 的卢易…

如何在 Eclipse 中调试ABAP程序

原文链接:Debugging an ABAP Program ADT 中的调试器是一个重要的诊断工具,可用于分析 ABAP 应用程序。 使用调试器,您可以通过在运行时 Debug 单步执行(F5)程序来确定程序无法正常工作的原因。这使您可以看到正在执…

101页PDF | 德勤_XX集团信息化顶层规划设计信息化总体解决方案(限免下载)

一、前言 这份报告是一份关于集团信息化顶层规划设计的总体解决方案,旨在通过信息化转型提升集团管控和企业运营效率。报告回顾了项目的背景、目标和工作过程,分析了集团面临的内部和外部挑战,并提出了一系列解决方案,包括自上而…

【案例】泛微.齐业成助力北京中远大昌汽车实现数电票全流程管理

中远大昌统一发票共享平台上线三个多月以来,实现: 5000份 60000元 发票开具 成本节约 客户简介及需求分析 北京中远大昌汽车服务有限公司(以下简称“中远大昌”)成立于2002年,是中远海运集团所属香远(北…

ubuntu中使用ffmpeg和nginx推流rtmp视频

最近在测试ffmpeg推流rtmp视频,单独安装ffmpeg是无法完成推流的,需要一个流媒体服务器,常用nginx,可以直接在ubuntu虚拟机里面测试一下。 测试过程不涉及编译ffmpeg和nginx,仅使用基本功能: 1 安装ffmpeg …

KMeans聚类实验(基础入门)

KMeans实验通常涉及使用KMeans聚类算法对数据集进行聚类分析。以下是一个关于KMeans实验的详细指导: 一、实验目的 加深对非监督学习的理解和认识。掌握动态聚类方法KMeans算法的设计方法。 二、实验环境 具有相关编程软件的PC机,通常使用Python、R等…

函数类型注释和Union联合类型注释

函数类型注释格式(调用时提示输入参数的类型): )def 函数名(形参名:类型,形参名:类型)->函数返回值类型: 函数体 Union联合类型注释(可注释多种类型混合的变量)格式: #先导入模块 from typing import…

重新定义社媒引流:AI社媒引流王如何为品牌赋能?

在社交媒体高度竞争的时代,引流已经不再是单纯追求流量的数字游戏,而是要找到“对的用户”,并与他们建立真实的连接。AI社媒引流王通过技术创新和智能策略,重新定义了社媒引流的方式,帮助品牌在精准触达和高效互动中脱…

基于Boost库的搜索引擎

本专栏内容为:项目专栏 💓博主csdn个人主页:小小unicorn ⏩专栏分类:基于Boots的搜索引擎 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识…

了解M有SQL索引

目录 索引介绍 索引的优缺点 索引底层数据结构选型 Hash表 二叉查找树(BST) AVL树 红黑树 B 树& B树 索引类型总结 主键索引(Primary Key) 二级索引 聚簇索引与非聚簇索引 聚簇索引(聚集索引) 聚簇索引介绍 聚簇索引的优缺点 非聚簇索引(非聚集索引) 非聚簇…

【C++】深入哈希表核心:从改造到封装,解锁 unordered_set 与 unordered_map 的终极奥义!

文章目录 修改哈希表模板参数迭代器HashTable 的默认成员函数HashTable 迭代器相关函数HashTable 的 Insert 函数HashTable 的 Find函数HashTable 的 Erase函数 封装 unordered_set封装 unordered_map测试 unordered_set 和 unordered_map 修改哈希表 我们基于链地址法实现的哈…

TEA加密逆向

IDA伪代码 do{if ( v15 )v17 v38; // x120x0->0x79168ba790, 输入字符串经过check1处理后字符串elsev17 v40;v18 (unsigned int *)&v17[v16]; // 0x78cbbd47fc add x12, x12, x8 ; x120x79168ba790->…

android 性能分析工具(03)Android Studio Profiler及常见性能图表解读

说明:主要解读Android Studio Profiler 和 常见性能图表。 Android Studio的Profiler工具是一套功能强大的性能分析工具集,它可以帮助开发者实时监控和分析应用的性能,包括CPU使用率、内存使用、网络活动和能耗等多个方面。以下是对Android …

【FPGA】Verilog:利用 4 个串行输入- 串行输出的 D 触发器实现 Shift_register

0x00 什么是寄存器 寄存器(Register)是顺序逻辑电路中使用的基本组成部分之一。寄存器用于在数字系统中存储和处理数据。寄存器通常由位(bit)构成,每个位可以存储一个0或1的值。通过寄存器,可以设计出计数器、加法器等各种数据处理电路。 0x01 寄存器的种类 基于 D 触发…

用 Python 从零开始创建神经网络(十):优化器(Optimizers)(持续更新中...)

优化器(Optimizers) 引言1. 随机梯度下降/Stochastic Gradient Descent (SGD)2. 学习率(Learning Rate)3. 学习率衰减(Learning Rate Decay)4. 带动量的随机梯度下降法(Stochastic Gradient Des…

鱼眼相机模型-MEI

参考文献: Single View Point Omnidirectional Camera Calibration from Planar Grids 1. 相机模型如下: // 相机坐标系下的点投影到畸变图像// 输入:相机坐标系点坐标cam 输出: 畸变图像素点坐标disPtvoid FisheyeCamAdapter::…

Spring Boot 实战:基于 Validation 注解实现分层数据校验与校验异常拦截器统一返回处理

1. 概述 本文介绍了在spring boot框架下,使用validation数据校验注解,针对不同请求链接的前端传参数据,进行分层视图对象的校验,并通过配置全局异常处理器捕获传参校验失败异常,自动返回校验出错的异常数据。 2. 依赖…

20241125复盘日记

昨日最票: 南京化纤 滨海能源 广博股份 日播时尚 众源新材 返利科技 六国化工 丰华股份 威领股份 凯撒旅业 华扬联众 泰坦股份 高乐股份高均线选股: 理邦仪器高乐股份日播时尚领湃科技威领股份资金最多的票: 资金攻击最多的票: …