第二周:李宏毅机器学习笔记

news2024/10/7 19:29:31

第二周学习周报

  • 摘要
  • Abstract
  • 一、深度学习
    • 1.Backpropagation(反向传播)
      • 1.1 链式法则
      • 1.2 Forward pass(前向传播)
      • 1.3 Backward pass(向后传播)
      • 1.4 总结
    • 2. Regression(神奇宝贝案例)
      • 2.1 第一步:设置Model(A set of function)
      • 2.2 第二步:评估函数的好坏(goodness of function)
      • 2.3 第三步:找到最好的function(best function)
        • 2.3.1 Gradient Descent
          • 2.3.1.1 Gradient Descent的最小值问题(linear regression没有local optimal)
      • 2.4 结果以及优化
        • 2.4.1 过拟合现象(overfitting)
      • 2.6 改善模型
        • 2.6.1 重新设置模型(Redesign the model)
        • 2.6.2 正则化(Regularization)
  • 二、Pytorch学习
    • 1. Pytorch加载数据的初认知
      • 1.1 Dataset与Dataloader
      • 1.2 Dataset代码实战
  • 总结

摘要

这周主要对Deep Learning进行了进一步的学习,内容包括反向传播算法的过程原理。还学习了regression,根据宝可梦的案例学习到了Loss中使用正则化的技巧。此还继续学习了Pytorch课程,包括学习Dataset和Dataloader各自的功能,以及Dataset的代码实战。

Abstract

This week, I mainly conducted further learning on Deep Learning, including the process principle of backpropagation algorithm. I also learned about regression and learned the technique of using regularization in Loss based on the case of Pok é mon. I also continued to study Python courses, including learning the functions of Dataset and Dataloader, as well as practical coding for Dataset.

一、深度学习

1.Backpropagation(反向传播)

回顾一下梯度下降的过程:
在这里插入图片描述
在学习梯度下降的算法中,我们计算的过程中的θ这个vector(向量)是非常长的,即可能会有上百万个参数,为了有效率地计算面对这么多参数,我们就需要使用反向传播算法去完成θ的计算了。

在这里插入图片描述

1.1 链式法则

链式法则是在学习高等数学中求复合函数导数非常常用的一种方法。完成链式求导主要需要掌握两个步骤:
1、列出各个变量之间的关系
2、根据关系写出链式(同一条路径相乘、不同路径相加)
例子如下:
在这里插入图片描述
掌握了链式法则后,我们就要用来解决实际的问题了。
假设我们神经网络结构如下图所示,
其中Cn是yn与ŷn的交叉熵(可以理解为它们之间的距离,距离越近则误差越小
我们要求Cn对w(权重未知量)的偏导。
在这里插入图片描述

1.2 Forward pass(前向传播)

因为我们的C是经过整个神经网络得出结果后得出预测值y与真实值ŷ计算出来的,所以是一个整体的性的值,要求偏导,就要一层一层的计算
所以,我们把下图的下三角先提出来,先处理这个部分的计算从而以小见大,理解整个个过程的计算。
在这里插入图片描述
在这个上三角中,我们有::
feature :x1与x2
未知量:w1,w2,b
z:是他们计算结果。
在这里插入图片描述
那么我们如何用这些变量来表示C对w的偏导呢?
先拿w1举例:
在这里插入图片描述
在上述计算总结中,我们很明显可以发现一个规律,就是w(权重)对应的偏导,就是其对应输入的值。
比如,下图中,w = 1对应的偏导为 -1(输入值)、w = -1 对应的偏导值为0.12(输入值)…以此类推。
在这里插入图片描述

1.3 Backward pass(向后传播)

那么处理完z对w的偏导,还有一个令人头痛的C对z的偏导要计算,因为我们如果用z的变量表达C,就要一直推导,非常麻烦,因为z后面还有N多层。那么要如何解决呢?

假设我们再往下走一层,就有了以下参数:
a:z经过sigmoid运算后的结果。
w3、w4…:未知数
z’‘,z’':同z一个意思。
在这里插入图片描述
表示如下:
在这里插入图片描述
假设1:其下一层就是输出层。
在这里插入图片描述
计算方式如下:
在这里插入图片描述
假设其下一层不是输出层,就要找其下一层再推导,直到找到输出层为止
所以,一开始从输出层往前推导快一点,因为都是已知结果
在这里插入图片描述

1.4 总结

计算z对w偏导用forward pass,计算C对z的偏导用Backward pass
在这里插入图片描述

2. Regression(神奇宝贝案例)

在学习regression中,我们了解到其实一个回归问题,用于解决预测问题。
比如输入对应的函数,就会输出一个结果。
如下图所示,可以用于股市趋势的预测、自动驾驶的场景、网络购物推介等
在这里插入图片描述
下面我们用预测宝可梦的战斗力的例子,来更加深入的了解Regression。
我们输入函数的参数如下:
Xcp:是feature,表示宝可梦原先的战斗力。
Xs:是宝可梦的名字。
Xhp:是宝可梦的血量
Xw:宝可梦的重量
Xh:宝可梦的高度
在这里插入图片描述

2.1 第一步:设置Model(A set of function)

假设我们设置一组函数(可以有无数个),这些函数都是线性的(linear model),但是不一定是正确的,需要使用training date来验证哪个函数最合理,最后用来预测宝可梦进化后的战斗力。
在这里插入图片描述

2.2 第二步:评估函数的好坏(goodness of function)

我们根据进化后的真实值与初始值一一对应起来,并做成一幅直观的图。
这些数据称之为training date
横轴代表初始战斗力(x1…x10)
纵轴代表精华后的真实战斗力(ŷ1…ŷ10)
在这里插入图片描述
要评估模型的好坏,就要用到Loss function,这里我们采用平方差的方式来表示Loss的大小,其实Loss function就是用来输出这个模型到底有多差(所以L越小越好)
在这里插入图片描述
关于括号里面数字的由来:
在这里插入图片描述
在下面的图像中,图像的颜色代表L的大小,越红代表数值越大,越偏蓝色代表数值越小
在这里插入图片描述

2.3 第三步:找到最好的function(best function)

找到最佳的function,就要找到w与b使L 最小(min)
在这里插入图片描述

2.3.1 Gradient Descent

为了找到最小值,我们还是使用 Gradient Descent,接下来我们复习一下:
假设只有一个未知数w
其中包含local optimal(是我们随机取点,一直找到的最小值)和global optimal(全局最小值,基本上很难实现)
在这里插入图片描述
假设有两个未知数w和b,我们可以以此类推:
我们就可以先带入w0,b0,求偏导值,然后算出w1,b1,再代入w1,b1求出w2,b2.以此类推。
这时候的L的梯度就是一个二维的Vector
再多的参数就再加维度即可。
在这里插入图片描述
于是我们把,偏导完整的格式写出来,如下图所示:
在这里插入图片描述
用图像来表示上述过程,如下图:在这里插入图片描述

2.3.1.1 Gradient Descent的最小值问题(linear regression没有local optimal)

当我们使用gradient decent时候,会出现一个问题:
比如在下图的左图中,如果我们随机取不同的点,L最小值也会不一样
完全看我们的人品
但是!
线性回归不会出现这个问题,
因为其Loss function是convex(凸面的),无论我们从哪一点出发,都可以找到同一个最小值。
在这里插入图片描述

2.4 结果以及优化

经过计算,我们得到了最佳的w与b
运用这套线性的模型,我们最终得出一个结果:
在测试集上的L为35.0,在训练集上为31.9.
在这里插入图片描述
那么我们是否有办法让其L更低,让模型更加准确呢?

2.4.1 过拟合现象(overfitting)

于是我们可以增加未知量,让模型变得更加复杂,模型也就更加的精准。
我们先添加一个w2的未知数到方程中,看到结果在测试集和训练集中的Loss都减少了,
测试集的平均错误:从35.0->18.4
训练集的平均错误:从31.9->15.4
在这里插入图片描述
于是我们继续增加w3,w4,w5,持续增加模型的复杂度,如下图所示:
在这里插入图片描述
按照理论来说,我们模型的复杂度越高,在训练集中的错误就越低(前提是使用gradient descent找到最佳的未知数值)。
在这里插入图片描述
但是从这个表格中,我们就发现一个问题:
随着模型越来越复杂,我们的Training的average Error使越来越低,但是我们在Testing上的Error却在w4后越来越高,特别是加入w5后达到了惊人的232.1。
这种现象就称之为过拟合现象(overfitting),通常是由于模型过于复杂导致的
因为我们最重要的还是要预测数据,所以testing上的Error是非常重要的(要做大考型选手,不做模拟哥)
因此,我们最佳的模型实际上就是加入w3后的模型。
在这里插入图片描述

2.6 改善模型

我们上面设置的模型,只考虑了个别的情况,但是我们的宝可梦进化实际上是受很多条件影响的,例如:不同物种之间进化后的强度是不一样的。
因此我们要考虑上一些隐藏的因素,再重新设置模型
在这里插入图片描述

2.6.1 重新设置模型(Redesign the model)

我们可以设置这样一个Model:使用一个类似编程语言中的if语句来完成不同物种进化使用不同model的功能
如下图中所示:
在这里插入图片描述
当我要预测Pidgey的进化后的攻击力,其他物种的Xs都为0,只有Xs=Pidgey的Xs为1
在这里插入图片描述
经过这一改变后,
我们的Training Data的Average error为3.8
Tesing Data的Average error 为14.3.
很明显这种对症下药的model效果非常显著
在这里插入图片描述
再或者我们在这个基础上,让模型更加复杂一点我们再增加一些未知数,模型说不定会预测地更加的精准
在这里插入图片描述

2.6.2 正则化(Regularization)

正则化是一种防止模型过拟合的手段,通过给损失函数加上一些限制条件,使模型参数更接近于0。
我们在Loss function中可以加入一个λ∑(wi)²,来使得线段更加平滑。

为什么要变得平滑呢?
因为越平滑的线就越能够减少外界的干扰,预测的准确度就越高(比如我们的输入数据有受到了一些干扰,会影响结果,我们加入这个部分后,就能减少这些干扰对结果的影响
在这里插入图片描述
我们通过控制λ的大小来控制线的平滑程度,我们需要平滑,但不能过于平滑。
因为可以看到当我们的λ从0增加到100,其在训练集和测试集上的Error都再一直下降
但是100后,图像就有一个转折点,再增加Error就变大了。
因此我们要根据测试结果,选定一个最佳λ,使得我们的效果最佳。
在这里插入图片描述

二、Pytorch学习

1. Pytorch加载数据的初认知

1.1 Dataset与Dataloader

在Pytorch中如何读取数据主要分为两个类,一个是Dataset、一个是Dataloader。

假设数据就是一堆垃圾,我们要在这堆垃圾中寻找我们有用的数据。
就要使用Dataset完成,然后经过Dataloader打包后,再传入网路中,如下图所示:
在这里插入图片描述
其中Dataset与Dataloader的功能如下:

名称DatasetDataloader
功能提供一种方式去获取数据以及其label (获取每一种数据以及其label、并告诉我们共有多少数据)为后面的网络提供不同的数据形式

1.2 Dataset代码实战

接下来,我们下载一个数据集,来学习Dataset
数据集下载链接https://download.pytorch.org/tutorial/hymenoptera_data.zip
解压打开后可以看到这个数据集包括训练集和验证集,里面都是一些蚂蚁和蜜蜂的图片,如下图所示:
在这里插入图片描述
这里的label 就是文件夹对应的名称(这是众多的组织形式之一)
在这里插入图片描述
在这里插入图片描述
接下来,我们启动jupyter notebook,输入以下代码,引入Dataset类

from torch.utils.data import Dataset

然后我们可以使用help函数,查看使用方法

help(Dataset)

在这里插入图片描述
或者使用**Dataset??**查看更加直观的使用方法

Dataset??

在这里插入图片描述
从上述英文,我们大致了解到Dataset的作用就是用来提取数据的
在这里插入图片描述
图片作为输入,一般是将图片的路径
在这里插入图片描述
接下来我们把数据集放到项目里(目的是为了生产相对路径,好说明图片位置):在这里插入图片描述
我们在python console中输入代码,将图片的绝对路径传输进去

from PIL import Image //导入PIL用于导入图片
img_path = "E:\DeepLearing\learn_pytorch\\Dataset\\train\\ants\\0013035.jpg" //图片绝对路径
img = Image.open(img_path) //赋值给img
img.size //查看图片的尺寸
img.show() //展示图片

效果如下:
在这里插入图片描述

import os
dir_path = "Dataset/train/ants"
img_path_list = os.listdir(dir_path)

在这里插入图片描述

然后,如果我们想要获取图片的所有地址,就需要用list获取图片文件夹,然后再用getitem获取的idx获取每张图片的地址。
在pycharm上输入如下代码:
(//后面为注释)

from torch.utils.data import Dataset //引入Dataset类
from PIL import Image //用于导入图片
import os //用于导入图片路径


class MyData(Dataset):

    def __init__(self, root_dir, label_dir): //初始化。self用于该类的全局变量,用于后面两个函数的作为变量使用
        self.root_dir = root_dir //根路径 比如:"Dataset/train"
        self.label_dir = label_dir //标签名,比如"ants""bees"
        self.path = os.path.join(self.root_dir, self.label_dir)//拼接在一起
        self.img_path = os.listdir(self.path) //转化为字节流

    def __getitem__(self, idx): //该函数用于获取各图片
        img_name = self.img_path[idx] //idx,表示每张图片序号,例如:idx = 0表示第一张图
        img_item_path = os.path.join(self.root_dir, self.label_dir, img_name) //拼接在一起
        img = Image.open(img_item_path) //赋值图片路径
        label = self.label_dir //赋值标签名字
        return img, label //返回图片信息和标签名

    def __len__(self): //用于返回有多少张图
        return len(self.img_path) //返回图片长度

//类实例化
root_dir = "Dataset/train" //训练集根路径
ants_label_dir = "ants" //蚂蚁标签
bees_label_dir = "bees" //蜜蜂标签
ants_dataset = MyData(root_dir, ants_label_dir) //创建蚂蚁dataset实例
bees_dataset = MyData(root_dir, bees_label_dir)//创建蜜蜂dataset实例
train_dataset = ants_dataset + bees_dataset //创建蚂蚁和蜜蜂dataset实例

输入后便创建了实例
在这里插入图片描述
运行如下代码,展示蚂蚁训练集第一张图片:

img,label = ants_dataset[0]
img.show()

在这里插入图片描述
运行如下代码,展示蜜蜂训练集第一张图片:

img,label = bees_dataset[0]
img.show()

在这里插入图片描述

len(bees_dataset)//蜜蜂训练集图片数量
len(ants_dataset)//蚂蚁训练集图片数量
len(train_dataset)//总训练集数量(蜜蜂 + 蚂蚁)

在这里插入图片描述

接下来,我们输入如下代码,创建image对应的label文件
首先我们要在Dataset目录下创建一个ants_label与bees_label用来存放txt的label文件。
代码如下:

import os

root_dir = "Dataset/train"
target_dir = "ants_image"
img_path = os.listdir(os.path.join(root_dir, target_dir))
label = target_dir.split('_')[0]
out_dir = "ants_label"
for i in img_path:
    file_name = i.split('.jpg')[0]
    with open(os.path.join(root_dir, out_dir, "{}.txt".format(file_name)), 'w') as f:
        f.write(label)

这段代码的作用是将指定目录下的所有以".jpg"结尾的图片文件的标签写入同名的".txt"文件中。假设有一个名叫"antsimage"的目录,里面存放了一些以"ants"开头的蚂蚁图片,我们需要将其标签写入同名的".txt"文件中,以便后续使用。

代码核心部分使用了Python的os模块来定位文件位置和创建文件
主要分为以下步骤:
1. 定义根目录rootdir、目标目录targetdir和标签label。在该段代码中,rootdir指的是存放所有图片的目录;targetdir指的是存放待处理图片的目录名称,本例中为"ants_image";而label则是标签,这里为"ants"。
2. 获取目标文件夹下所有图片文件的名称,并去掉文件扩展名".jpg",只保留文件名。
3. 遍历所有文件,使用with open()语句创建同名".txt"文件,并向其中写入标签label。
4. 循环结束后,所有的图片的标签都写入了同名".txt"文件中,存放在指定的目录out_dir下。

总之,这段代码的作用是将一些图片的标签写入同名文件中,方便后续使用。
在这里插入图片描述
将上述代码的ants换成bees就可以生成蜜蜂的label文件
在这里插入图片描述

总结

这一周在Deep Learning的课程李宏毅中学习到了反向传播算法、regression宝可梦案例,其中在反向传播算法主要是为了提高了在梯度下降算法中的计算效率,在反向传播算法中分为foward pass和 backward pass两种模式,都是解决了在链式求导的裂项中如何求值的问题。在regression中复习了之前的内容,并学习率正则化(Regularization)这个知识点,主要用于防止过拟合,使Loss变得平滑,减少干扰。此外还继续学习了pytorch,学会了如何使用Dataset和定义其里面的getitem(用于获取图片)和len(用于统计图片数量)函数,并用文件操作完成label文件的批量创建。
最后希望继续保持学习的热情,更多的去了解底层原理,下一周计划学习classification的神奇宝贝案例、逻辑回归,以及继续学习pytorch的TensorBoard的使用课程。

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

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

相关文章

CountDownLatch内部原理解析

文章目录 1、CountDownLatch介绍1.1、功能介绍1.2、demo1.3、问题 2、前置知识2.1、AQS整体结构2.1.1、整体结构2.1.2、state属性2.1.3、head和tail属性 3、CountDownLatchAPI源码解析3.1、countDown方法3.1.1、Sync类3.1.2、releaseShared方法3.1.3、tryReleaseShared方法 3.2…

ICMP协议详解及尝试用ping和tracert捕抓ICMP报文

一、ICMP协议 1.1、定义 ICMP(Internet Control Message Protocol,互联网控制消息协议)是一个支持IP层数据完整性的协议,主要用于在IP主机、路由器之间传递控制消息。这些控制消息用于报告IP数据报在传输过程中的错误&#xff0c…

ChatGPT4深度解析:探索智能对话新境界

大模型chatgpt4分析功能初探 目录 1、探测目的 2、目标变量分析 3、特征缺失率处理 4、特征描述性分析 5、异常值分析 6、相关性分析 7、高阶特征挖掘 1、探测目的 1、分析chat4的数据分析能力,提高部门人效 2、给数据挖掘提供思路 3、原始数据&#xf…

保研复习 | 数据结构

目录 CH1 绪论☆ 数据项、数据元素、数据结构☆ 逻辑结构和存储结构的区别☆ 顺序存储结构和链式存储结构的比较☆ 算法的重要特性☆ 算法的复杂度 CH2 线性表☆ 单链表 CH3 栈、队列和数组☆ 栈和堆是什么?☆ 栈在括号匹配中的应用☆ 栈在表达式求值中的应用☆ …

14-41 剑和诗人15 - RLAIF 大模型语言强化培训

​​​​​​ 介绍 大型语言模型 (LLM) 在自然语言理解和生成方面表现出了巨大的能力。然而,这些模型仍然存在严重的缺陷,例如输出不可靠、推理能力有限以及缺乏一致的个性或价值观一致性。 为了解决这些限制,研究人员采用了一种名为“人工…

3dsMax怎样让渲染效果更逼真出色?三套低中高参数设置

渲染是将精心构建的3D模型转化为逼真图像的关键步骤。但要获得令人惊叹的渲染效果,仅仅依赖默认设置是不够的。 实现在追求极致画面效果的同时,兼顾渲染速度和时间还需要进行一些调节设置,如何让渲染效果更加逼真? 一、全局照明与…

昇思25天学习打卡营第13天|K近邻算法实现红酒聚类

K近邻算法(K-Nearest-Neighbor, KNN)是一种用于分类和回归的非参数统计方法,是机器学习最基础的算法之一。它正是基于以上思想:要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接…

数据结构基础--------【二叉树基础】

二叉树基础 二叉树是一种常见的数据结构,由节点组成,每个节点最多有两个子节点,左子节点和右子节点。二叉树可以用来表示许多实际问题,如计算机程序中的表达式、组织结构等。以下是一些二叉树的概念: 二叉树的深度&a…

win10使用小技巧二

1. 解决电脑更新后无法连接打印机问题 步骤:右击电脑 → 选择“管理” → 打开“服务和应用程序” → 双击“服务” → 找到“Print Spooler” → 双击打开 → 在“常规”中将“启动类型”改为“自动” → 点击“应用” → 点击“确定” → 重启电脑。 2. 提升电脑…

rocketmq-console可视化界面功能说明

rocketmq-console可视化界面功能说明 登录界面OPS(运维)Dashboard(驾驶舱)Cluster(集群)Topic(主题)Consumer(消费者)Producer(生产者)Message(消息)MessageTrace(消息轨迹) rocketmq-console是rocketmq的一款可视化工具,提供了mq的使用详情等功能。 本章针对于rock…

css使用伪元素after或者before的时候想要给after设置z-index无效

css使用伪元素after或者before的时候想要给after或者before设置一个层级关系,使该伪类写入的样式在box的下面,发现给box设置z-index无效, 需要找到父级元素,在父级元素上设置z-index值并且将伪类设置z-index:-1

在数字化时代,自助BI是数据价值最大化的必经之路

引言:在数字化时代,数据已成为企业最宝贵的资产之一。然而,仅仅拥有海量数据并不足以带来竞争优势,关键在于如何有效地分析并利用这些数据以指导决策、优化运营、提升客户体验,并最终实现业务的持续增长。在一章里笔者…

实验1 主成分分析

目 录 二、实验环境... 1 三、实验内容... 1 3.1 导入数据... 2 3.2 求相关系数矩阵.. 3 3.3 数据规范化处理.. 3 3.4 主成分分析... 4 四 实验心得... 5 一、实验目的 (1)理解主成分分析的思想; (2)掌握主成分分析方…

昇思25天学习打卡营第19天 | CycleGAN图像风格迁移互换

内容介绍: CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络,该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。 该模型一个重要应用领域是域迁移(Domain Adaptation),可以通俗地理解…

常用SQL语句(基础篇)

前言 查询的sql的结构是 select...from...where...group by...having...order by...limit... 写查询sql的时候需要按照如下顺序写 from,where(and,or,!),group by,select&#xf…

文件系统技术架构分析

一文读懂:什么是文件系统 ,有哪几类? ▉ 什么是文件系统? 技术大拿眉头皱了皱,忍住快要爆发的情绪。解释到: 数据以二进制形式存储于介质,但高低电平含义难解。文件系统揭秘这些二进制背后的意…

智能交通(3)——Learning Phase Competition for Traffic Signal Control

论文分享 https://dl.acm.org/doi/pdf/10.1145/3357384.3357900https://dl.acm.org/doi/pdf/10.1145/3357384.3357900 论文代码 https://github.com/gjzheng93/frap-pubhttps://github.com/gjzheng93/frap-pub 摘要 越来越多可用的城市数据和先进的学习技术使人们能够提…

代码随想录 数组部分+代码可在本地编译器运行

代码随想录 数组部分,代码可在本地编译器运行 文章目录 数组理论基础704.二分查找题目:思路二分法第一种写法二分法第二种写法 代码 27.移除元素题目:思路-双指针法代码 977.有序数组的平方题目思路-双指针代码 209.长度最小的子数组题目&am…

《Windows API 每日一练》8.4 edit控件

编辑类是最简单的预定义窗口类,而另一方面却又是最复杂的。当你用“edit”作为类名创建子窗口时,可以基于CreateWindow调用的x坐标、y坐标、宽度和高度参数定义一个矩形。这个矩形包含可编辑的文本。一旦子窗口控件获得输入焦点,你就可以输入…

黑色矩形块检测数据集VOC+YOLO格式2000张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2000 标注数量(xml文件个数):2000 标注数量(txt文件个数):2000 标注…