深度学习 | Pytorch深度学习实践

news2024/11/15 22:45:07

一、overview

 基于pytorch的深度学习的四个步骤基本如下:

        



二、线性模型 Linear Model

基本概念

  • 数据集分为测试集和训练集(训练集、开发集)
  • 训练集(x,y)测试集只给(x)
  • 过拟合:模型学得太多导致性能不好
  • 开发集:测验模型泛化能力
  • zip:从数据集中,按数据对儿取出自变量x_val和真实值y_val


         

  • 本例中进行人工training,穷举法
  • 定义前向传播函数forward
  • 定义损失函数loss
  • MSE:平均平方误差
  • zip:从数据集中,按数据对儿取出自变量x_val和真实值y_val
import numpy as np
import matplotlib.pyplot as plt

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

def forward(x):#定义模型
    return x * w

def loss(x,y):#定义损失函数
    y_pred = forward(x)
    return (y_pred - y) * (y_pred - y)

w_list=[]#权重
mse_list=[]
for w in np.arange(0.0,4.1,0.1):
    print('w=',w)
    l_sum = 0
    for x_val,y_val in zip(x_data,y_data):
        y_pred_val = forward(x_val)
        loss_val = loss(x_val,y_val)
        l_sum += loss_val
        print('\t',x_val,y_val,y_pred_val,loss_val)
    print('MSE=',l_sum / 3)
    w_list.append(w)
    mse_list.append(l_sum / 3)

plt.plot(w_list,mse_list)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()

         


注:模型训练可视化

wisdom:可视化工具包



三、Gradient Descent 梯度下降

 3.1、梯度下降

(基于cost function 即所有样本):

如我们想要找到w的最优值

        

  • 贪心思想:每一次迭代得到局部最优,往梯度的负方向走
  • 梯度下降算法很难找到全局最优,但是在深度学习中损失函数中,全局最优最有很少出现,但会出现鞍点(梯度 = 0)

        

import numpy as np
import matplotlib.pyplot as plt

w = 1.0
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

def forward(x):
    return x * w

def cost(xs,ys):
    cost = 0
    for x,y in zip(xs,ys):
        y_pred = forward(x)
        cost += (y_pred-y)**2
    return cost / len(xs)

def gradient(xs,ys):
    grad = 0
    for x,y in zip(xs,ys):
        grad += 2 * x * ( x * w - y)
    return grad / len(xs)

epoch_list=[]
cost_list=[]
print('Predict (before training)',4,forward(4))
for epoch in range(100):
    cost_val = cost(x_data,y_data)
    grad_val = gradient(x_data,y_data)
    w -= 0.01 * grad_val
    print('Epoch',epoch,'w=',w,'loss=',cost_val)
    epoch_list.append(epoch)
    cost_list.append(cost_val)
print('Predict (after training)',4,forward(4))

print('Predict (after training)',4,forward(4))
plt.plot(epoch_list,cost_list)
plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()

         

  • 注:训练过程会趋近收敛
  • 若生成图像局部震荡很大,可以进行指数平滑
  • 若图像发散,则训练失败,通常原因是因为学习率过大


3.2、 随机梯度下降 Stochastic Gradient Descent

(基于单个样本的损失函数):

 —— 因为函数可能存在鞍点,使用一个样本就引入了随机性

此时梯度更新公式为:

         

与之前的区别:

  • cost改为loss
  • 梯度求和变为单个样本
  • 训练过程中要对每一个样本求梯度进行更新
  • 由于两个样本的梯度下降不能并行化,时间复杂度太高
  • 所以折中的方式:使用 Mini-Batch 批量随机梯度下降
  • 若干个一组,后续将会涉及
import numpy as np
import matplotlib.pyplot as plt

w = 1.0
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

def forward(x):
    return x * w

def loss(x,y):
    y_pred = forward(x)
    return (y_pred-y)**2

def gradient(x,y):
    return 2 * x * (x * w - y)

loss_list=[]
epoch_list=[]
print('Predict (before training)',4,forward(4))

for epoch in range(100):
    for x,y in zip(x_data,y_data):
        grad = gradient(x,y)
        w = w - 0.01 * grad
        print('\tgrad',x,y,grad)
        l = loss(x,y)
        loss_list.append(l)
        epoch_list.append(epoch)
    print("progress",epoch,'w=',w,'loss=',l)

print('Predict (after training)',4,forward(4))
plt.plot(epoch_list,loss_list)
plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()

         

         



四 、反向传播 BackPropagation

对于复杂的网络:

举例来讲两层神经网络

        

若进行线性变换,不管多少层,最终都可以统一成一种形式,但为了让你不能在化简(即提高模型复杂程度),所以我们要对每一层最终的输出

加一个非线性的变化函数(比如sigmiod)

        

则层层叠加若需要求梯度的话就要用到  —— 链式求导:

  • 1、构建计算图 —— 前馈计算(Forward)先计算最终的loss

        

  • 2、反馈(Backward)

         

 来看一下最简单的线性模型中的计算图的计算过程:

        


        

在pytorch中,使用tensor类型的数据

        

import torch
import matplotlib.pyplot as plt

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

w = torch.Tensor([1.0]) #注意这里一定要加[] 权重初始值
w.requires_grad = True

def forward(x):
    return x * w #因为w是Tensor,这里的运算符已经被重载了,x会进行自动转换,即构造了计算图

def loss(x,y):
    y_pred = forward(x)
    return (y_pred - y) ** 2

epoch_list = []
loss_list = []
print('Predict (before training)',4,forward(4))

for epoch in range(100):
    #sum=0
    for x,y in zip(x_data,y_data):
        l = loss(x,y) #只要一做backward计算图会释放,会准备下一次的图
        l.backward()
        print('\tgrad:',x,y,w.grad.item()) #item将梯度数值直接拿出来为标量
        w.data = w.data - 0.01 * w.grad.data #grad必须要取到data

        #sum += l 但l为张量,计算图,进行加法计算会构造计算图,将会发生溢出

        w.grad.data.zero_() #!!!权重里面梯度的数据必须显式清零

        print("progress",epoch,l.item())
        epoch_list.append(epoch)
        loss_list.append(l.item())

print('Predict (after training)',4,forward(4))
plt.plot(epoch_list,loss_list)
plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()

         



五、利用PyTorch实现线性回归模型 Linear Regression With PyTorch

pytorch神经网络四步走

  • 1、构建数据集
  • 2、设计模型(用来计算y_hat)
  • 3、构建损失函数和优化器(我们使用pytorch封装的API)
  • 4、训练周期(前馈 反馈 更新)

本例将使用 Mini-Batch,numpy有广播机制矩阵相加会自动扩充。

         

 使用pytorch的关键就不在于求梯度了,而是构建计算图,这里使用仿射模型,也叫线性单元。

代码实现:

import torch
import matplotlib.pyplot as plt

# 1、准备数据
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[2.0],[4.0],[6.0]])

# 2、构建模型
class LinearModel(torch.nn.Module):
    def __init__(self): #构造函数
        super(LinearModel,self).__init__()
        self.linear = torch.nn.Linear(1,1) #构造一个对象

    def forward(self,x):
        y_pred = self.linear(x) #实现可调用对象
        return y_pred

model = LinearModel()

# 3、构造损失函数和优化器
criterion = torch.nn.MSELoss(size_average=False) #继承nn.Module,是否求平均
optimizer = torch.optim.SGD(model.parameters(),lr=0.01) #是一个类,不继承nn.Module,不会构建计算图,lr学习率

epoch_list = []
loss_list = []

for epoch in range(100):
    # 前馈 计算 y_hat
    y_pred = model(x_data)
    # 前馈 计算损失
    loss = criterion(y_pred,y_data)
    print(epoch,loss) # loss是一个对象,打印将会自动调用__str__()

    optimizer.zero_grad() # 所有权重梯度归零
    # 反馈 反向传播
    loss.backward()
    # 自动更新,权重进行更新
    optimizer.step()

    epoch_list.append(epoch)
    loss_list.append(loss.item())

# Output weight and bias
print('w = ',model.linear.weight.item())
print('b = ',model.linear.bias.item())

# Test Model
x_test = torch.Tensor([4.0])
y_test = model(x_test)
print('y_pred = ',y_test.data)
plt.plot(epoch_list,loss_list)

plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()

         

       

         

        



七、Multiple Dimension lnput 

引例:糖尿病数据集分类任务

行称为:样本(Sample)      数据库中称为:记录(record)

列称为:特征                   数据库中称为:字段

注:sklearn中提供一个关于糖尿病的数据集可作为回归任务的数据集

Mlultiple Dimension Loqistic Regression Model

        

再来看下Mini-Batch(N samples)的情况

        

为什么这里要将方程运算转换成矩阵运算 即 向量形式呢?

———— 我们可以利用并行运算的能力,提高运行速度。

        

Logistics回归只有一层神经网络,若我们构造一个多层神经网络


         

将矩阵看成一种空间变换的函数,这里的(8,2)是指将一个人一八维空间的向量映射到一个二维空间上,注意是线性的,而我们所做的空间变换不一定是线性的,

所以我们想要多个线性变换层通过找到最优的权重,把他们组合起来,来模拟一个非线性变换

注意绿色框中我们引入的 \sigma 即激活函数 ,在神经网络中我们通过引入激活函数给线性变换加入非线性操作,这样就使得我们可以去拟合相应的非线性变换。


对于本例 Example: Artificial Neural Network

        

1、建立数据集

import numpy as np
import torch

xy = np.loadtxt('./dataset/diabetes.csv.gz', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:, :-1])
y_data = torch.from_numpy(xy[:, [-1]])
  • 分隔符为,
  • 为什么用float32,因为常用游戏显卡只支持32位浮点数,只有特别贵的显卡才支持64位
  • 注意y,拿出来需要加中括号,拿出来矩阵

2、模型建立

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1 = torch.nn.Linear(8, 6)
        self.linear2 = torch.nn.Linear(6, 4)
        self.linear3 = torch.nn.Linear(4, 1)
        self.sigmoid = torch.nn.Sigmoid()

    def forward(self, x):
        x = self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x))
        return x

model = Model()
  •  注意上次调用的是nn.Function下的sigmoid,但是这里调用的是nn下的一个模块

 3、构造损失函数和优化器

criterion = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

 4、模型训练(这里还是全部数据)

for epoch in range(100):
    # forward
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())

    # backword
    optimizer.zero_grad()
    loss.backward()

    # update
    optimizer.step()

可以尝试不同的激活函数对结果的影响

torch.nn — PyTorch 2.1 documentation

Visualising Activation Functions in Neural Networks - dashee87.github.io

注意:Relu函数取值是0到1,如果最后的输入是小于0的,那么最后输出会是0,但我们可能会算In0,所以一般来说会将最后一层的激活函数改成sigmoid。



九、多分类问题

交叉熵损失和NLL损失到底有什么区别?

lmplementation of classifier to MNIST dataset

  • ToTenser:神经网络想要的输入比较小,所以需要转变成一个图像张量        
    • 黑白图像:单通道
    • 彩色图像:通道channel
  • Normalize:标准化 切换到 0,1 分布 ,参数为 均值 标准差
  • 四阶张量变成二阶张量
  • 注意 最后一层不做激活

        



十、CNN 卷积神经网络 基础篇

首先引入 ——

  • 二维卷积:卷积层保留原空间信息
  • 关键:判断输入输出的维度大小
  • 特征提取:卷积层、下采样
  • 分类器:全连接

        


引例:RGB图像(栅格图像)

  • 首先,老师介绍了CCD相机模型,这是一种通过光敏电阻,利用光强对电阻的阻值影响,对应地影响色彩亮度实现不同亮度等级像素采集的原件。三色图像是采用不同敏感度的光敏电阻实现的。
  • 还介绍了矢量图像(也就是PPT里通过圆心、边、填充信息描述而来的图像,而非采集的图像)
  • 红绿蓝 Channel
  • 拿出一个图像块做卷积,通道高度宽度都可能会改变,将整个图像遍历,每个块分别做卷积

引例:

深度学习 | CNN卷积核与通道-CSDN博客


 实现:A Simple Convolutional Neural Network

         

  • 池化层一个就行,因为他没有权重,但是有权重的,必须每一层做一个实例
  • 交叉熵损失 最后一层不做激活!

        


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

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

相关文章

【网络安全 --- xss-labs通关】xss-labs靶场通关,让你巩固对xss漏洞的理解及绕过技巧和方法(提供资源)

一,资源下载准备 1-1 VMware 16.0 安装请参考以下博客,若已经安装请忽略: 【网络安全 --- 工具安装】VMware 16.0 详细安装过程(提供资源)-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程(…

IPIDEA代理IP如何帮助企业采集市场信息

在当今数字化的时代,市场信息对于企业的发展至关重要。然而,如何高效地收集市场信息成为了每个企业都需要面对的问题。爬虫技术的出现为企业提供了一种高效、便捷的信息采集方式。然而,由于爬虫的请求频率较高,目标网站可能会将频…

Linux | gcc/g++的使用

目录 前言 一、程序的翻译过程 1、预编译 2、编译 3、汇编 4、链接 (1)链接做了什么 (2)动态链接 (3)静态链接 (4)如何使用gcc进行动态链接和静态链接 前言 本章主要带着大…

【实战】学习 Electron:构建跨平台桌面应用

文章目录 一、Electron 简介二、Electron 的优势1. 学习曲线平缓2. 丰富的生态系统3. 跨平台支持4. 开源和社区支持 三、Electron 的使用1. 安装 Node.js2. 安装 Electron3. 创建项目4. 初始化项目5. 安装依赖6. 创建主进程文件7. 创建渲染进程文件8. 打包应用程序9. 运行应用程…

【AI视野·今日NLP 自然语言处理论文速览 第五十六期】Tue, 17 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 17 Oct 2023 (showing first 100 of 135 entries) Totally 100 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Step-by-Step Remediation of Students Mathematical Mistakes Authors…

泛微e-office json_common.php SQL注入漏洞

一、漏洞描述 泛微e-office为企业办公提供丰富应用,覆盖常见协作场景,开箱即用。满足人事、行政、财务、销售、运营、市场等不同部门协作需求,帮助组织高效管事理人。 系统 json_common.php 文件存在SQL注入漏洞 二、网络空间搜索引擎搜索 …

【前端学习】—Vuex(十八)

【前端学习】—Vuex(十八) 一、Vuex Vuex是一个专门为Vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

虚拟机zeppelin安装

一、解压 tar -zxvf ./zeppelin-0.10.0-bin-all.tgz -C /opt/soft/ 二、改名字 mv ./zeppelin-0.10.0-bin-all.tgz zeppelin010 三、配置/etc/profile #ZEPPELIN export ZEPPELIN_HOME/opt/soft/zeppelin010 export PATH$ZEPPELIN_HOME/bin:$PATH source /etc/profile 四…

Vue笔记_插件组件_lucky-canvas抽奖转盘

文章目录 官网使用(vue2.x)[1] 下载[2] 引入[3] 使用配置项-width/height配置项-blocks配置项-prizes配置项-buttons优化案例 lucky-canvas 是一个基于 Js Canvas 的抽奖 web 前端组件,提供 大转盘和 九宫格两种抽奖界面,UI 精美,功能强大…

Linux创建与删除用户

Linux创建与删除用户 新增用户: adduser 用户名【添加用户】 passwd 用户名【设置用户密码】删除用户: userdel -r 用户名【删除用户】

C++QT---QT-day2

/*使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中, 在槽函数中判断ui界面上输入的账号是否为"admin",密码是否…

THE PLANETS:EARTH vulnhub

信息收集 netdiscover -i eth0 -r 192.168.239.0,扫描存活主机,发现目标主机 对目标主机进行端口扫描:nmap -p- -sV -O -Pn -A 192.168.239.186,发现443端口存在DNS,域名 在本地得/etc/hosts中添加域名信息 浏览…

地垫/毛绒地毯/地毯GCC认证测试项目介绍

出口美国地垫GCC清关认证 美国联邦法律规定,地毯和垫子要符合易燃性标准和其它要求, 包括2008年《美国消费品安全改进法》的要求。 在地毯和垫子经过检测或合理检测项目后,作为一般用途的 地毯和垫子的生产商和进口商必须在一般合规证书&…

在 Python 中如何向列表或数组添加元素

在这篇文章中,你将了解 Python 中的 .append() 方法。你还会看到 .append() 与其他用于向列表添加元素的方法有什么不同。 让我们开始吧! Python 中的列表是什么?给初学者的定义 编程中的数组是一个有序的项目集合,所有的项目都…

开关电源EMC整改案例-辐射骚扰

1. 测试结果 产品 Coconut1首次 EMC 测试时,辐射、静电、浪涌均失败。本篇先讨论辐射超标. 1.1 辐射超标 50MHz 、100MHz 、130MHz 、200MHz ,4 个频点明显超标,其中 130MHz 左右最明显, 超出 19dB;后将电路板仅…

龙芯S-2K2000板卡测试记录,安装loongnix系统已知问题及DPDK

S-2K2000板卡已知问题 安装系统时PMON需要使用acpi传参pmon下USB键盘不支持热插拔pmon下插入部分USB键盘 进pmon特别慢,兼容性问题,后续统一解决不支持emmc,等待更新pmon S-2K2000板卡手动引导USB命令 load (usb0,0)/boot/vmlinuz. initr…

Julia 笔记:初识julia

1 变量 Julia 不需要指定变量类型,它可以自动推断等号右侧的对象类型 x 10 # 将 10 赋值给变量 xstr "hello" # 将字符串赋值给变量 site_nameflt 9.5 # 浮点型数据 2 注释 单行注释以 # 开头多行注释用 # 与 # 将注释括起来 3 数组 可以存储一个…

windows terminal鼠标右键打开

如果在官网上下载的是zip文件的 需要在注册表修改鼠标右键才能出来 注册表修改如下: 1.先windowsR,在命令框中输入regedit 打开注册表 2.在路径’计算机\HKEY_CLASSES_ROOT\directory\background\shell’下新建一个wt,wt下新建commond 这里…

优化Bloom的降采样

但是我发现不如提高Skip Iterions的数值,降采样的分辨率降低会产生锯齿

Scrum敏捷项目管理中,开发人员(Developers)的职责

​在Scrum敏捷开发中,开发人员(Developers)是Scrum团队中最重要的角色之一,负责产品的开发和交付,其重要性不言而喻。 那开发人员的职责和需要参加的活动是什么呢? Developers核心职责: 承诺…