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

第二周学习周报

  • 摘要
  • 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 osroot_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.mzph.cn/bicheng/42700.shtml

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

相关文章

Redis常用命令——Set、Zset篇

文章目录 一、Set相关命令操作 SADD SMEMBERS SISMEMBER SCARD SPOP SMOVE SREM SINTER 与 SINTERSTORE SUNION 与 SUNIONSTORE SDIFF 与 SDIFFSTORE Set命令小结 二、Zset 相关命令操作 ZADD ZCARD ZCOUNT ZRANGE ZREVRANGE ZPOPMAX BZPOPMAX ZPOPMIN 与 BZPOPMIN ZRANK 与 …

MySQL事务隔离

MySQL事务隔离 前言锁共享锁(Shared Lock)排他锁(Exclusive Lock)行级锁(Row-Level Lock)表级锁(Table-Level Lock)快照读和当前读查看锁 事务事务的四个特性事务的并发问题事务的隔…

《Windows API每日一练》8.5 listbox控件

列表框是将一批文本字符串显示在一个具有滚动功能的方框中的控件。通过发送消息到列表框的窗口过程,程序可以添加或删除列表中的字符串。当列表框中的一个项目被选中时,列表框控件便发送 WM_COMMAND消息到其父窗口。然后父窗口确定哪个项目被选中。 本节…

J024_打印电影的全部信息

一、需求描述 展示多部电影的信息。 电影信息包括:电影名称、电影得分、电影票价格。 二、代码实现 2.1 Movie类 package com.itheima.collection;public class Movie {//电影名称private String name;//电影得分private int score;//电影票价格private double…

【Unity 3D角色移动】

【Unity 3D角色移动】 在Unity 3D中实现角色移动通常涉及到几个关键步骤,包括设置角色的物理属性、处理输入、更新角色的位置以及动画同步。下面是实现基本3D角色移动的步骤和示例代码: 步骤1:设置角色的物理属性 角色通常使用Character Co…

OpenCV杂记(4):OpenCV之色彩映射(伪彩applyColorMap)

1. 简述 我们在开发基于热成像(红外)或者做深度估计应用时,为了便于直观的观察,常常将检测结果进行色彩上的映射,这样便可以很直观的看出哪里温度高,哪里温度低,或者哪里深度更深或更浅。 我们将…

数列结构(3.9)——队列应用

树的层次遍历 树的层次遍历,也称为树的广度优先遍历,是一种按照树的层次顺序,从上到下、从左到右遍历树中所有节点的算法。在二叉树中,这种遍历方式通常使用队列来实现。下面是层次遍历的基本步骤: 创建一个空队列&a…

Golang | Leetcode Golang题解之第220题存在重复元素III

题目: 题解: func getID(x, w int) int {if x > 0 {return x / w}return (x1)/w - 1 }func containsNearbyAlmostDuplicate(nums []int, k, t int) bool {mp : map[int]int{}for i, x : range nums {id : getID(x, t1)if _, has : mp[id]; has {retu…

java中反射(Reflection)的4个作用

java中反射(Reflection)的4个作用 作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断任意一个类所具有的成员变量和方法作用4、在运行时调用任意一个对象的方法总结 💖The Begin💖…

【Android】自定义换肤框架05之Skinner框架集成

引入依赖 api("io.github.hellogoogle2000:android-skinner:1.0.0")初始化Skinner 在所有功能前调用即可,建议在Application中初始化 SkinnerKit.init(application)安装皮肤包 在应用该皮肤包前安装即可,建议预安装,或应用皮肤…

扩散模型笔记2

Ref:扩散模型的原理及实现(Pytorch) 在扩散模型中,每一步添加的噪声并不是完全一样的。具体来说,噪声的添加方式和量在每一步是根据特定的规则或公式变化的。这里我们详细解释每一步添加噪声的过程。 正向过程中的噪声添加&…

vb.netcad二开自学笔记9:界面之ribbon

一个成熟的软件怎么能没有ribbon呢&#xff0c;在前面的框架基础上再加个命令AddRibbon <CommandMethod("AddRibbon")> Public Sub AddRibbon() Dim ribbonControl As RibbonControl ComponentManager.Ribbon Dim tab As RibbonTab New RibbonTab() tab.Tit…

初中化学知识点总结(人教版)

第一单元 走进化学世界 一 物质的变化和性质 1物理变化&#xff1a;没有生成其它物质的变化叫做物理变化。 化学变化&#xff1a;生成其他物质的变化叫做化学变化&#xff0c;又叫化学反应。 物理变化和化学变化的区别&#xff1a;是否有其他物质生产。 2化学变化的基本特…

Python - 自动化办公,将yml根据转换规则转换成‘‘ = ‘‘

文章目录 前言## Python - 自动化办公&#xff0c;将yml根据转换规则转换成 1. 准备工作2. demo3. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会…

【教程】新的Selenium!整合了隐藏浏览器指纹等功能

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 前景提要 driver Driver() 常用driver 接口 最后的话 前景提要 新的selenium&#xff0c;整合了隐藏浏览器指纹&#xff0c;非常好用&#x…

算法库应用--KMP算法解决串匹配问题

学习来源 学习贺利坚老师博客 数据结构例程——串的模式匹配&#xff08;KMP算法&#xff09;_数据结构模式匹配例题-CSDN博客 本人引导博客 串的匹配 (KPM算法由来引导)_kpm匹配失败-CSDN博客 转载大佬sofu博客 https://www.cnblogs.com/dusf/p/kmp.html 本人详细思路引导b战…

代码随想录算法训练营第四十九天| 300.最长递增子序列 , 674. 最长连续递增序列 , 718. 最长重复子数组

300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int lengthOfLIS(int[] nums) {int[] dp new int[nums.length];dp[0] 1;for(int i1;i<nums.length;i){for(int j0;j<i;j){if(nums[i] > nums[j]){dp[i] Math.max(dp[j],dp[i])…

【Spring Boot】关系映射开发(三):多对多映射

《JPA 从入门到精通》系列包含以下文章&#xff1a; Java 持久层 API&#xff1a;JPA认识 JPA 的接口JPA 的查询方式基于 JPA 开发的文章管理系统&#xff08;CRUD&#xff09;关系映射开发&#xff08;一&#xff09;&#xff1a;一对一映射关系映射开发&#xff08;二&#…

香橙派AIpro做目标检测

使用香橙派AIpro做目标检测 文章目录 使用香橙派AIpro做目标检测香橙派AIpro开发板介绍香橙派AIpro应用体验快速体验香橙派的AI功能YOLOV5s目标检测使用场景描述图像目标检测视频目标检测摄像头目标检测YOLOv5s 目标检测的运行结果分析香橙派 AIpro 在运行过程中的表现 香橙派A…