【9.9-9.15学习周报】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


目录


摘要

本周注意要对梯度在线性回归中的应用、梯度下降在多元中的应用以及如何选取学习率进行了学习。此外学习了pytorch中的Dataset抽象类来表示数据集,运用TensorBoard来查看用于查看训练过程中的各种指标和模型结构,以及学习了正则表达式的相关知识。

Abstract

This week, we will pay attention to the application of gradient in linear regression, the application of gradient descent in multivariates, and how to choose the learning rate. In addition, I learned the Dataset abstract class in pytorch to represent the dataset, used the TensorBoard to view various indicators and model structures used to view the training process, and learned the relevant knowledge of regular expressions.

一、梯度下降的线性回归

在这里插入图片描述
如图左边是我们的线性回归模型,右边是代价函数。而梯度下降的方法即用原来的w和b减去代价函数对他们的偏导值,以下展示手算过程:
在这里插入图片描述
述有时也称为“批量梯度下降(Batch Gradient Descent)”。指的是在梯度下降的每一步中,我们都用到了所有的训练样本。

二、多元线性回归

在模型f=wx+b中我们可以知道房子的价格(f)与房子的大小(x)为线性相关,然而在现实中,我们更具体来说影响房价的因素可以有多个:
在这里插入图片描述
如上图所示,房子的大小、卧室的数量、楼层数,房子的年限等都会对房子的价格产生影响,此时单一的变量x在该模型下使用已经不太合适了。这时我们需要根据实际情况定义多个x,或者将所有因素全部归结为一个向量即(x1,x2,x3…xn).根据图中的例子我们可以将房子的大小、卧室的数量、楼层数,房子的年限看出一个向量,用x^(i)表示,例如:x ^(3)=[852 2 1 36],若表示单个属性可以用x (i)(j)表示,**即上行下列**,例如x(3)(1)=852,x ^(2)(3)=2。
在这里插入图片描述
于是我们可以将x1,x2,x3…xn都归结为向量的形式,该模型便转化为我们熟悉的线性回归模型

三、多元梯度下降

在多元模型中我们同意可以运用梯度下降算法,过程如下:
在这里插入图片描述

在这里插入图片描述
将上述梯度下降公式应用于代价函数中即可得到我们要找出使得代价函数最小的一系列参数:
在这里插入图片描述
以下是手动推算过程:在这里插入图片描述
与之前一样,开始时我们随机选择一系列的参数值,计算所有的预测结果后,再更新所有的参数的值,如此循环直到收敛。

1.特征缩放

在这里插入图片描述
如图所示,我们可以选择房子大小和卧室数量用来预测房子的房价。左边得到的模型为price=50size+0.1bedrooms+50,右边的模型为price=0.1size+50bedroom+50,虽然只是将w1,w2的参数进行了互换可实际的预测值天差地别,左边为100w美刀,右边恰好50w美刀,很显然根据梯度下降法在多元中的应用我们可以得到多个结果,但是哪个结果更加符合实际还需要我们通过一些方法去选择。
在这里插入图片描述
我们可以绘制一下price=50size+0.1bedrooms+50的散点图和等高线图,由图像可知我们以0-2000的房子尺寸和0-5间卧室作为参数得出的函数图像特别扁平,梯度下降算法需要非常多次地迭代才能收敛。在这里插入图片描述
为了解决该问题,我们可以将x1,x2的范围重新选取一下,用各自的最大最小值除以他们的最大值,得到新的x1,x2的范围,如图所示,该散点图分布较为集中,得出的等高线图较为平滑,更加容易收敛从而得到我们需要的最小的代价函数。
在这里插入图片描述
或者可以采用特征缩放,即是尝试将所有特征的尺度都尽量缩放到-1到1之间。最简单的方法是令: x n ∗ = x n − μ n s n \bold{{{x}_{n}^{*}}=\frac{{{x}_{n}}-{{\mu}_{n}}}{{{s}_{n}}}} xn=snxnμn,即概率论中的标准化随机变量, μ n {\mu_{n}} μn是平均值, s n {s_{n}} sn是标准差或者为变量的范围。
在这里插入图片描述

2.学习率

通过之前的学习我们可以指导学习率影响这代价函数的收敛。如果学习率太小,代价函数要收敛可能就得需要移动很多步。如果学习率太大就可能导致代价函数的参数移动的步幅过大从而可能越过局部最小值导致无法收敛。
在这里插入图片描述
实际中我们可以绘制函数代价函数和迭代次数的函数图像,通关观察函数收敛时的迭代次数来确定当前的学习率是否合适。
在这里插入图片描述
当函数图像经常出现升降,无法收敛于一个局部最小值的时候我们就要考虑代码是否有bug或者学习率是否过大。关于如何选取学习率,我们可以先采取一套固定大小关系的,例如a=0.001,0.01,0.1,假设我们在尝试0.00l的时候所绘制出的代价函数与迭代次数的图像收敛过慢,我们可以尝试一下0.01,若0.01导致代价函数无法收敛,此时我们可采取3倍3倍地放大,将学习率调整为0.003,0.006,直至找到一个合适的图像。总得来说,我们可以通过先选取一系列学习率,然后找到一个合适的范围,最后选取范围内较大的学习率。

四、特征和多项式回归

在这里插入图片描述
有时候我们绘制出散点图后,当我们无法用一次函数那样的模型去很好地拟合的时候我们会尝试使用含二次项或者三次项的函数去拟合。通常我们需要先观察数据然后再决定准备尝试怎样的模型。比如一个二次模型 h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x}+{\theta_{2}}{x^{2}} hθ(x)=θ0+θ1x+θ2x2或者三次模型: h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x}+{\theta_{2}}{x^2}+{\theta_{3}}{x^3} hθ(x)=θ0+θ1x+θ2x2+θ3x3。根据图像我们可以令: x 1 = s i z e , x 2 = s i z e 2 x_{1}=size,x_{2}=size^{2} x1=size,x2=size2,从而得到二次假设: h θ ( x ) = θ 0 + θ 1 ( s i z e ) + θ 2 ( s i z e ) 2 {{{h}}_{\theta}}(x)={{\theta }_{0}}\text{+}{{\theta }_{1}}(size)+{{\theta}_{2}}{{(size)}^{2}} hθ(x)=θ0+θ1(size)+θ2(size)2

由于二次函数先增后减,不能很好的拟合数据,所以还可以令
x 1 = s i z e , x 2 = s i z e 2 , x 3 = s i z e 3 x_{1}=size,x_{2}=size^{2},x_{3}=size^{3} x1=size,x2=size2,x3=size3,则有:在这里插入图片描述
这样我们就可以将该模型转化为我们熟悉的线性回归模型。根据函数图形特性,我们还可以使: h θ ( x ) = θ 0 + θ 1 ( s i z e ) + θ 2 s i z e {{{h}}_{\theta}}(x)={{\theta }_{0}}\text{+}{{\theta }_{1}}(size)+{{\theta }_{2}}\sqrt{size} hθ(x)=θ0+θ1(size)+θ2size

注意,如果我们采用多项式回归模型,在运行梯度下降算法前特征缩放非常有必要。

五、Dataset和tensorboard

1.Dataset

Dataset 是一个抽象类,我们想要获取什么样的数据,并把想获取的数据表示出来就要用到Dataset类。你需要继承 Dataset 类,并实现两个主要的方法:

len():返回数据集中样本的数量。
getitem(index):根据索引 index 返回一个数据样本。该样本通常是一个元组 (input, target),其中 input 是输入数据,target 是标签。
在这里插入图片描述

以下是利用Dataset来获取"蚂蚁"和"蜜蜂"的数据集并将他们表示出来的一个实例,具体代码如下:


```python
import torch
from torch.utils.data import Dataset
from PIL import Image
import os


class MyDataset(Dataset):
    def __init__(self, root_dir, label_dir):
        self.root_dir = root_dir  # 定义父级目录的label
        self.label_dir = label_dir  # 定义子级目录的label
        self.path = os.path.join(root_dir, label_dir)  # 获取父级和子级文件的路径
        self.img_path = os.listdir(self.path)  # 根据路径获取子级文件夹所有图片的label

    def __getitem__(self, item):
        img_name = self.img_path[item]  # 根据索引item获取对应位置的图片
        img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)  # 获取对应的图片名,父label和子label
        img = Image.open(img_item_path)  # 打开对应图片
        lable = self.label_dir  # 获取该图片label
        img.show()
        return img, lable

    def __len__(self):
        return len(self.img_path)  # 返回该数据集长度



root_dir = 'dataset/train'
ant_label_dir = 'ants'
bee_label_dir = 'bees'

ant_dataset = MyDataset(root_dir, ant_label_dir)
bee_dataset=MyDataset(root_dir,bee_label_dir)

train_dataset=ant_dataset+bee_dataset#当数据集不够大的时候可以把两个数据集拼起来

# ant_dataset.__getitem__(200)
train_dataset.__getitem__(200)











运行结果如下:在这里插入图片描述
上述代码中,由于蚂蚁和蜜蜂这两个数据集组多就124个,对应下标0-123,当下标大于123时就会发生索引越界。于是我们可以定义一个训练数据集train_dataset便可避免该情况。

2.Tensorboard

TensorBoard 是 TensorFlow 提供的一个可视化工具,用于查看训练过程中的各种指标和模型结构。尽管 TensorBoard 是为 TensorFlow 设计的,但 PyTorch 也支持通过 tensorboard 插件将训练过程中的数据可视化。这使得在 PyTorch 中使用 TensorBoard 变得可行,帮助你监控和调试模型训练过程。

在我们安装好tensorboard以后我们就可以通过代码来进行具体测试:

from torch.utils.tensorboard import SummaryWriter

writer=SummaryWriter("logs")

for i in range(100):
    writer.add_scalar("y=x",i,i)

writer.close()



代码运行成功后会生成对应的文件夹,此时我们可以打开anoaconda prompt输入tensorboard --logdir logs命令来查看我们的模型结构:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、正则表达式

正则表达时通常用来进行匹配字符串,广泛用于邮箱,密码验证等多方面,以下是我根据正则表达式常用的符号所做的思维导图:
在这里插入图片描述

总结

本周继续跟进学习了线性回归和梯度下降更加深入的知识,同时开始pytorch框架有关代码的学习。计划在下周继续更加地深入学习机器学习的相关理论内容,同时学习transforms和Dataload的使用,为推进神经网络的理论和代码同时学习做好准备

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值