数据分析-深度学习Pytorch Day11

news2024/11/20 3:20:19

首先要搞懂损失函数与代价函数。

损失函数是单个样本与真实值之间的差距

代价函数是整个样本集与真实值的平均差距

随机梯度下降就是不使用代价函数对参数进行更新,而是使用损失函数对参数更新。

梯度下降法( gradient descent )是一阶最优化算法,通常也称为最速下降法,是通过函数当前点对应梯度(或者是近似梯度)的反方向,使用规定步长距离进例行迭代搜索,从而找到一一个函数的局部极小值的算法,最好的情况是希望找到全局极小值。但是在使用梯度下降算法时,每次更新参数都需要使用所有的样本。如果 对所有的样本均计算一次, 当样本总量特别大时,对算法的速度影响非常大,所以就有了随机梯度下降(stochastic gradient descent, SGD )算法。它是对梯度下降法算法的一种改进,且每次只随机取一部分样本进行优化, 样本的数量一般是2的整数次幂,取值范围是32~256,以保证计算精度的同时提升计算速度,是优化深度学习网络中最常用的一类算法。

SGD算法及其一些变种, 是深度学习中应用最多的一类算法。在深度学习中,SCD通常指小批随机梯度下降( mini-batch gradient descent )算法,其在训练过程中,通常会使用一个固定的学习率进行训练。 即

gt是梯度, n是学习率,学习率用来调整梯度影响大小,梯度完全依赖于batch得到的数据

由于随机梯度下降算法的缺点,动量的思想被加入到算法中:动量通过模拟物体运动的方向,在更新时会在一定程度上考虑之前参数更新的大小和方向,同时利用batch计算得到的梯度,两者结合起来计算出最终参数的大小以及方向,引入动量之后,参数更新方式为:

mt是当前动量的累加, u 是动量因子,用于调整上一步动量对参数更新时的重要程度,利用动量的方式可以使得算法跳出局部最优解的陷阱

梯度下降:

import matplotlib.pyplot as plt
import numpy as np

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

m = len(x_data)
w = 1.0

def forward(x, w):
    return w * x

def cost_fun(x, y, w):
    cost = 0
    for x_val, y_val in zip(x, y):
        pred = forward(x_val, w)
        cost += 1 / m * (pred - y_val) ** 2
    return cost

def gradient_fun(x, y, w):
    gradient = 0
    for x_val, y_val in zip(x, y):
        pred = forward(x_val, w)
        gradient += 2 * (1 / m) * x_val * (pred - y_val)
    return gradient

print('predict before training:', 4, forward(4, w))
epoches = 20
lr = 0.03
cost_list = []
for epoch in range(epoches):
    cost_val = cost_fun(x_data, y_data, w)
    grad_val = gradient_fun(x_data, y_data, w)
    w -= lr * grad_val
    cost_list.append(cost_val)
    print('epoch:', epoch, 'w:', w, 'cost:', cost_val)

print('predict after training:', 4, forward(4, w))


# 绘图
epoch = np.arange(epoches)
plt.plot(epoch, cost_list)
plt.xlabel('epoch')
plt.ylabel('cost')
plt.show()

随机梯度下降:

import matplotlib.pyplot as plt
import numpy as np

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

w = 1.0
m = len(x_data)
def forward(x, w):
    return w * x

def loss_fun(x, y, w):
    pred = forward(x, w)
    loss = (pred - y) ** 2
    return loss

def gradient(x, y, w):
    pred = forward(x, w)
    grad = 2 * x * (pred - y)
    return grad

epoches = 30
lr = 0.03
loss_list = []

for epoch in np.arange(epoches):
    print('epoch:', epoch)
    loss_sum = 0
    for x_val, y_val in zip(x_data, y_data):
        grad = gradient(x_val, y_val, w)
        loss_val = loss_fun(x_val, y_val, w)
        loss_sum += loss_val
        w -= lr * grad
        print('\t', 'w:', w, 'loss:', loss_val)
    loss_list.append(loss_sum / m)
print('predict after training:', 4, forward(4, w))

epoch = np.arange(epoches)
plt.plot(epoch, loss_list)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

在学习率相同的情况下,采取随机梯度下降可以获得更快的收敛效果。

当数据集比较多的时候如果每次一个一个样本的计算会导致很大的计算量,训练时间会很长。如果每次使用一整个训练集花的时间少,但是收敛慢。

在实际训练中,一般采取折中的办法,对一个训练集划分批次。一个批次中可以包含多个样本。每次训练一个批次的数据,用一个批次的数据计算

损失并对参数进行更新。

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

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

相关文章

SpringBoot+VUE前后端分离项目学习笔记 - 【27 SpringBoot集成Redis】

以首页的文件访问作为示例使用Redis 一方面加快用户访问速度 一方面缓解频繁访问数据库的压力 之前每次访问首页都会请求数据库数据 Redis安装以及配置 所需文件 解压后,双击下述脚本,启动redis 可视化软件安装、设置安装路径然后一直点下一步就OK …

Java OpenJDK 8u362 Windows x64 Installer

文章目录(一)Azul(二)Adopt(三)IBM(四)Oracle(一)Azul WEB Page:🔗Download Azul Zulu Builds of OpenJDK Windows installer&#xf…

一位老测试对测试用例之个人见解

刚入行的时候,看了很多关于测试相关的文章,记得有一篇说到测试用例是测试灵魂让我印象深刻。如今,我入行几年了,越发深感测试用例的设计重要性,可以这么说,测试用例的设计与管理是测试工程师的核心技能。我…

一套计算机网络系统设计方案,包含外网、内网、智能化设备网

一套计算机网络系统设计方案,包含外网、内网、智能化设备网。 弱电工程设计的计算机网络系统一般分为三种:内网、外网、设备网,这三种网络系统如何设计?它们的架构是如何的呢? 计算机网络系统就是利用通信设备和线路将…

面试_Http常见问题

http协议的默认端口 80 应用层有哪些协议 http ,FTP,SMTP,DNS,MQ 在浏览器中输入网址后会发生什么: 首先服务器有自己的ip地址,但ip地址对人来说很难记,所以人会在浏览器里输入域名,然后经过DNS解析为ip,访问对应的服务器 与服务…

内网云盘如何内网穿透实现公网访问

云盘是一种专业的互联网存储工具,是互联网的云技术产物,它通过互联网为企业和个人提供信息的存储、读取、下载等服务,具有安全稳定、海量存储的特点。随着企业信息化发展,云盘系统需求不断扩大,相关系统软件被广泛应用…

自己动手写一个操作系统——loader(1)

前言 上篇文章中,我们写了一个简单的 loader 作为被加载的演示对象。我们知道 loader 是用来加载 kernel 的,今天我们就编写 loader 代码完成这件事情。 实模式下的内存地址 我们计划把 kernel 加载到内存的 0x10000 地址处。 不过面临一个挑战&…

pug模板在Express框架中的集成

在未讲相关的模板引擎之前前面的篇目中所使用的网页页面大多是静态资源的网页内容,如在之前的案例中就使用过 app.use(express.static(path.join(__dirname,public))) ,通过在本地上进行搭建服务器之后使用express.static()方法讲public下静态…

uni-app从入门到上天视频教程 23讲 我终于卷完了

大家好,我是锋哥!祝大家新年快乐! 过年走亲访友,休息了几天,今天把uni-app课程卷完了,23讲,免费基础课程。 uni-app技术介绍 uni-app 是一个使用 Vue.js 开发所有前端应用的框架,…

(免费分享)springboot音乐网站系统

开发工具:eclipse,数据库mysql5.7 jdk1.8技术:springbootmybatis/** * * * */package com.bjpowernode.music.ss.service.impl;import java.util.List;import javax.annotation.Resource;import com.bjpowernode.music.common.AbstractServ…

即时通讯开发之TCP/IP基本概念

在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱 了各地人的口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不…

【数据结构】详解顺序表

目录 1.线性表和顺序表 1.线性表 2.顺序表 2.接口的实现 1. 接口1---初始化顺序表 2. 接口2,3---头插,尾插 3. 接口4,5---头删,尾删 4. 接口6,7---插入,删除 5. 接口8---查找 6. 接口9---修改 7.…

什么是HTTPS?为什么要为您的网站购买一个?

HTTPS或安全超文本传输协议是HTTP的安全版本,是一种用于在Web浏览器和网站之间通过Web传输数据的协议。HTTPS通过使用一种称为传输层安全性(TLS)的加密协议对服务器和浏览器之间传递的所有数据进行加密,以提高安全性,该协议前面是SSL&#xf…

【Pytorch项目实战】之人脸检测与识别:基于face_recognition开源人脸识别库

文章目录人脸检测与识别(一)实战:人脸检测(图片)(二)实战:人脸检测与识别(视频)人脸检测与识别 face_recognition 是开源人脸识别库。Face Recognition官网。…

启科 QuTrunk+Runtime+QuSaaS+亚马逊云科技量子计算编程实战

QuTrunk 是启科量子自主研发的一款免费、开源、跨平台的量子计算编程框架,包括量子编程 API、量子命令转译、量子计算后端接口等。它提供多种量子计算体验,提供本地量子计算 Python 计算后端,提供 OMP 多线程、MPI 多节点并行、GPU 加速等计算…

操作系统权限提升(一)之操作系统权限介绍

前言 操作系统权限提升简称提权,顾名思义就是提升自己在目标系统中的权限。现在的操作系统都是多用户操作系统,用户之间都有权限控制,比如通过Web漏洞拿到的是web进程的权限,往往Web服务都是以一个权限很低的账号启动的,因此通过 Webshell进行一些操作会受到限制,这就需要将其…

Leetcode力扣秋招刷题路-0094

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 94. 二叉树的中序遍历(Easy) 给定一个二叉树的根节点 root ,返回它的 **中序 **遍历。 示例 1: 输入:root [1,null,2,3] 输出…

无线网络概论_4

成帧细节 数据帧:好比802.11中的驮马,负责在工作站直接板运输数据。控制帧:通常能够与数据帧搭配使用,负责区域的清空,信道的取得以及载波监听的维护并于收到数据时给予肯定确认,借此来增加数据传输的可靠…

垃圾收集器必问系列—CMS

本文已收录至Github,推荐阅读 👉 Java随想录 应该相信,自己是生活的战胜者。——雨果 文章目录CMS简介运作过程CMS的缺陷处理器资源敏感无法处理“浮动垃圾”内存碎片纵观全书《深入理解JVM虚拟机》第三版,在垃圾回收器这一篇章&a…

CMakelists.txt简单介绍

先祝大家开工大吉,这篇策划一下CMakelists.txt,它依托在Cmake里,在大型工程、平台兼容方面非常好用的C项目编译工具,再此先对它做一个简短的介绍。 目录 一、CMakelists.txt简介 二、使用示例 三、总结 一、CMakelists.txt简介…