第四周:机器学习笔记

第四周学习周报

  • 摘要
  • Abstract
  • 机器学习任务攻略
    • 1.loss on training data
      • 1.1 training data的loss过大怎么办?
      • 1.2 training data的loss小,但是testing data loss大怎么办?
    • 2. 如何选择一个中最好的模型?
      • 2.1 Cross Validation(交叉验证)
      • 2.2 N-fold Cross Validation(N倍交叉验证法)
  • 拓展专题——贝叶斯
    • 1.什么是贝叶斯定理
    • 2. 贝叶斯公式模型的理解
    • 3. 朴素贝叶斯法(Naive Bayes model)
  • Pytorch——TensorBoard学习
    • 1.TensorBoard的安装
    • 2. add_scalar()的使用
    • 3. add_image()的使用
  • 总结

摘要

这一周对李宏毅机器学习内容进行了更进一步的学习,学习了机器学习任务攻略。此外还对贝叶斯定理进行了更进一步的拓展学习,加深了对贝叶斯定理的理解。最后对Pytorch进行了学习,学会使用了Tensorboard。

Abstract

This week, I further studied Li Hongyi’s machine learning content and learned about machine learning task strategies. In addition, further extended learning was conducted on Bayes’ theorem, deepening the understanding of Bayes’ theorem. Finally, I learned Pytorch and learned how to use Tensorboard.

机器学习任务攻略

通过下图,回顾一下机器学习的三步骤

简单的执行,只能让结果刚好到平均偏上的水平。我们肯定要让结果做的更好,我们要怎么办?
如下图所示:
如果我们感觉自己的训练结果不好,我们可以按照如下攻略进行优化。在这里插入图片描述

1.loss on training data

1、检查我们的training data的loss
为什么不是看testing data的loss?
因为要看training data有没有学起来,因为training data的Loss过大证明没有训练好,更别谈再测试集中的表现了,所以之后再看testing data的Loss。

1.1 training data的loss过大怎么办?

造成loss过大,有两个可能
第一个可能:Model bias(模型偏差)
Model bias的意思就是模型过于简单,需要将你的模型复杂化
假如我们设计了一个简单的model,对于不同的θ输出不同的值,把所有的值组合成一个set(集合)后,即便我们找到在这个集合范围里面最佳的θ*使得Loss变得小,但是离我们的small loss还是相差很远,这就是模型过于简单带来的劣势。
就好比如:
在大海里面捞针本来就是一件很难的事情,可是针并不在大海上,所以做再多努力也无法找到一个small loss。
在这里插入图片描述
解决方法:需要重新设计我们的模型,使我们的简单模型复杂化
方式1:就是增加更多的feature(特征,即x输入)
从我们学习周报第一周的视频观看人数的例子中就可以看出来,更多的feature能够有效的减少Loss值第一周学习周报链接–点击进入
方式2:增加更多的neurons(神经元)和layers(层数)
例如,增加一个sigmoid函数运算;将这一层的输出作为下一层的输入增加层数。
在这里插入图片描述
第二个可能:optimization(最佳化)做的不好
在第一周学习时候,我们就知道我们是通过Gradient Descent(梯度下降)来完成optimization的,但是会存在local minima和global minima,我们所找到随机初始点不同,得到的local minima是不一样的
就好比如:我们在大海捞针,针确实在海里,但是我们捞不出来
在这里插入图片描述
那么当我们的Loss过大时,如何确定是哪一种情况呢,是Model Bias还是Optimization?
在这里插入图片描述
方式1:比较不同和的Model
通过比较不同的Model来判断是否存在Model Bias的问题。
从下图中,我们可以清楚的看到20层比56层在测试集上的Loss更低,难道这是overfitting吗?
很显然不是
因为overfitting是,在训练集上表现的很好,但是在测试集上表现的很差。
所以,再比较Training data中的Loss 发现20层比56层在测试集上的Loss更低。
很显然,其Loss偏大是由于Optimization造成的。
在这里插入图片描述
那么我们如何更好的判断Optimization issue呢?
我们可以从更浅层次的network或者其他更简单的模型(例如:linear model)开始optimize,因为这些更浅层次和更简单的model可以更加容易的去优化,先确定大致的情况

然后在更深层次的network中我们如果得到的loss不降反升,就证明是Optimization issue。
比如,下图中的一栏数据,5层比4层在training data的loss还要高,就证明是Optimization issue。
在这里插入图片描述

1.2 training data的loss小,但是testing data loss大怎么办?

造成这种情况有两种可能:过拟合和Mismatch
Mismatch指的是训练集和测试集有着不同分布(一般不常见,所以不讨论)

接下来再重点学习一下overfitting(过拟合)
再次强调,overfitting是,在训练集上表现的很好,但是在测试集上表现的很差。是在训练集和测试集上的事情

导致overfitting的情况如下:
1、模型问题
举一个比较极端的例子:
假如,我们找到了一个一无是处的function,遇到对应的x输出真实值y,否则则随便输出一个值。
那在训练集中,肯定是100%正确率的
就是好像平时训练,你看着试卷的答案,你再写出来
但在测试集中,表现结果会非常糟糕
就比如你一直作弊,考试就寄了
这种模型很显然就会导致过拟合
在这里插入图片描述
2、training data太少
比如,我们正确的曲线如下图左边所示
但是我们训练集只有三个,即便我们的model很强很厉害,但在这三点之外,这个model制作的图像可能就会天马行空,完全脱离了testing data,就会导致testing data的Loss很大
在这里插入图片描述
3、模型过于复杂
如下图情况中,随着模型越来越复杂 training data的loss一直降低,但是testing data的loss过了一个点会一直升高。
在这里插入图片描述
解决overfitting方法:
一、简化模型
因为造成overfitting很可能是模型过于复杂导致的。

简化模型的方式:给模型增加更多的限制
就比如这个情况,我们假设已知是二元二次方程,我们给model添加限制后,过这三个点的曲线只能是这样的。
在这里插入图片描述
添加限制可以用如下方法:
1、减少变量数量,共享变量
2、更少的features(特征)
3、早停法(Early Stopping)

Early Stopping是一种训练技术,‌旨在监控模型在验证数据集上的性能,‌以决定是否继续训练。‌
 当模型的验证性能停止提升,‌或者甚至开始下降时,‌训练过程将被终止。‌
 这种技术可以防止模型在训练数据上过拟合,‌从而提高模型的泛化性能。‌

4、Regularization(正则化,前面周报有提到)
5、Dropout层(深度学习CNN内容,通过Dropout层可以减少过拟合)
注意:有些概念后续会在深度学习进行补充,现在了解即可
在这里插入图片描述
但是过多的限制不是好事,如下图所示:
如果我们限制在一个二元一次方程(直线),永远也没有一条直线可以通过这三个点,于是就会找距离这三个点最近的直线,导致训练集和测试集的表现效果都很差,又会回到model bias问题
在这里插入图片描述
二、增加更多训练集数据(data augmentation)(如果训练的是图片可以将图片左右翻转)因为training data过少会导致过拟合现象,因为很可能有发生个例当成普遍的错误,从而在testing data中表现很差。
在这里插入图片描述

2. 如何选择一个中最好的模型?

随着模型越来越复杂 training data的loss一直降低,但是testing data的loss过了一个点会一直升高那么我们怎么找到一个最佳的model(就比如找到下图中的点),让其loss最小呢?
在这里插入图片描述
假设我们有三个模型,他们的复杂的程度不太一样,我不知道选哪一个模型才会刚刚好在测试资料上得到最好的结果。因为你选太复杂的就会导致overffting,太简单的有model bias的问题。

那怎么选一个不偏不倚的的模型呢?
把这三个模型的结果都跑出来。然后上传到kaggle上面,你及时的知道了你的分数,看看哪个分数最低,那个模型显然就是最好的模型。但是并不建议你这么做

 Kaggle 是一个面向数据科学和机器学习爱好者的在线平台
 它提供了一个用于数据科学竞赛、数据集分享和模型训练的环境。

为什么不建议你这么做呢?
我们举一个极端的例子,我们再把刚才那个极端的例子拿出来,假设现在有一群model。这一群model不知道为什么都非常费他们每一个model产生出来的都是一无是处的方式。
这一到1M的model,他们会做的事情都是:训练资料里面有的就记录下来,没有的就Random值
你再把这1M个模型的结果上传到kaggle上面,你就得到1M的分数,然后这1M的分数里面哪一个结果最好,你就觉得那个模型是最好的。所以也许编号56789的那一个模型,它找出来的方式正好在testing data上面,就给你一个好的结果。

但是如果你这样做,往往就会得到非常糟的结果
在这里插入图片描述
因为这个model有些结果毕竟是随机的,它恰好在test public的testing set上面得到一个好结果。但是private testing set的结果可能仍然是随机的。

为什么分成public跟private?为什么我们不能就通通都分public?
你仔细想想看,假设所有的 testing set都是public。刚刚算是一个一无是处的model,得到的一无是处的function,它也有可能在public的testing set上面得到好的结果。

如果我们今天只有public没有private
那你就回去写一个方程,该方程不断random产生输出就好,然后不断把这些众多model上传到kaggle,然后看你什么时候可以认得出一个好的结果,那就结束了,那这个显然没有意义,显然不是我们要的。
在这里插入图片描述

2.1 Cross Validation(交叉验证)

那到底要怎么做才选择才是比较合理的呢?
我们就需要用到Cross Validation(交叉验证)
可以把training的资料分成两部分
一部分叫做training set,另一部分叫做validation set(校验集)
90%的资料用于training set里面,有10%的资料会被拿来做validation set

验证集可以防止过拟合。‌
通过验证集,‌开发者可以调整模型参数、‌选择模型结构和进行超参数优化。‌
验证集与训练集相互独立,‌但与测试集相似,‌通常包含较训练集少一些的样本,‌以便更快地评估模型。‌
验证集的表现作为参数调整和模型选择的依据,‌帮助选择最佳的超参数和模型结构。‌
此外,‌验证集还能提供一个信号,‌即在模型开始过拟合时提供一个停止优化的信号,‌因为当验证集上的性能开始下降时,‌通常意味着模型已经开始过度适应训练数据,‌而忽略了新数据的泛化能力

在training set训练出来的模型,用validation set去衡量分数。
validation set去衡量的结果。上传到kaggle上面去看看你得到的它的分数。

因为你在挑分数的时候是用validation state来挑model,所以在public上的testing set分数就可以反映你的private上的testing set分数。
就不会得到在public上面结果很好。但是在private上面结果很差的状况。
在这里插入图片描述

2.2 N-fold Cross Validation(N倍交叉验证法)

但是这边会有一个问题,就是怎么分training set呢?可能搞不好我分到很奇怪的validation。
那么就需要用到N-fold Cross Validation(N倍交叉验证法)
切成n等份啊,在这个例子里面呢,我们切成三等份,切完以后你拿其中一份当做validation set。另外两份当做训练集
然后这件事情你要重复三次
也就是说,你先第一、二份当trian,第三份当Val。
然后第一、三份当train,第二份当val
以此类推

在这里插入图片描述
然后接下来有三个模型。你不知道哪一个是好的,要怎么做呢?
如下图所示:
把这三个模型在这三个设置下,在这三组training跟validation的data set在上面通通跑一次。

然后把这三个模型在这三种状况的结果都平均起来,把每一个模型在这三种状况的结果都平均起来,再看看谁的结果最好。

假设用这3-fold得出来的结果是这个Model 1最好,就把Model 1用在全部的training set上

最后将Model 1训练出来的模型才用在testing set上
在这里插入图片描述
至此机器学习的攻略就到此结束。

拓展专题——贝叶斯

在上一周的机器学习中,我们在二分类问题中用到了贝叶斯公式,贝叶斯对于我们的Classification具有重大的作用,因此需要开一个拓展专题来研究一下贝叶斯。

1.什么是贝叶斯定理

举个不太恰当的例子:
比如说有一个家人,有父亲、母亲、和一个正在读初中的儿子
母亲有一天打扫房间卫生,发现儿子的房间多了一个打火机,于是她就会怀疑在小学的儿子是不是在外面结识了社会人士学会抽烟了。
出于对儿子的担心于是她咨询她的朋友,她的朋友是一名数学家,于是她的朋友告诉她就可以用贝叶斯定理来计算她儿子抽烟的几率有多大
她的朋友跟她说,
贝叶斯模型,主要有这几个重要组成部分:

1、先验概率:即根据先前的经验对事物产生初步的判断(可以理解为,根据自己的社会经验、生活经验判断儿子抽烟的概率有多大)

2、接收新信息:例如隔几天再看看儿子的房间有没有烟,或者衣服上有没有烟味

3、根据新信息更新对事物的判断:即根据2再去判断儿子抽烟的概率有多大,得出一个后验概率

所以这位母亲开始收集这些信息。
首先是先验概率: **如果这个打火机没有出现在儿子的房间,儿子抽烟的几率有多大。**这个问题肯定是不好估计的,于是母亲根据自己的见解和生活经验给出了答案:她觉得5%比较合适

然后 根据贝叶斯定理,
还需要有两个概率
1、如果儿子真的抽烟,那在儿子房间发现打火机的概率有多少?
2、如果儿子没有抽烟,那在儿子房间发现打火机的概率有多少?

对于1,母亲觉得其儿子是一个比较粗心的人,如果真的抽烟,在房间里遗落打火机的可能性很大,于是她将1的概率定为50%

对于2,也有合理的解释,是不是其父亲抽烟时候不小心把打火机留在耳机房间了,又或者儿子的打火机是外面捡到的,出于好奇心就带回家了。于是她将2的概率定为5%

接下来,我们把先验概率、概率1、概率2带入贝叶斯定理
P ( A i ∣ B ) = P ( A i ) P ( B ∣ A i ) ∑ j = 1 n P ( A j ) P ( B ∣ A j ) = P ( A i ) P ( B ∣ A i ) P ( A 1 ) P ( B ∣ A 1 ) + … + P ( A n ) P ( B ∣ A n ) P\left(A_{i} \mid B\right)=\frac{P\left(A_{i}\right) P\left(B \mid A_{i}\right)}{\sum_{j=1}^{n} P\left(A_{j}\right) P\left(B \mid A_{j}\right)}=\frac{P\left(A_{i}\right) P\left(B \mid A_{i}\right)}{P\left(A_{1}\right) P\left(B \mid A_{1}\right)+\ldots+P\left(A_{n}\right) P\left(B \mid A_{n}\right)} P(AiB)=j=1nP(Aj)P(BAj)P(Ai)P(BAi)=P(A1)P(BA1)++P(An)P(BAn)P(Ai)P(BAi)

具体计算如下:‘
可以看发现打火机的情况下,儿子抽烟的几率为34%,称之为后验概率,证明可能性是比较低的。
这是由于母亲相信耳机仅有5%可能性抽烟的先验概率前提下导致的
在这里插入图片描述
但是如果,出现了第二次这样的情况(即获取到了新信息,例如发现了烟,或者在衣服闻到烟味),这个概率就会随之改变。

于是我们把上一步得到的后验概率当作这一次的先验概率,来判断儿子是否抽烟,可得儿子抽烟的概率为84%
在这里插入图片描述
经过不断收集新的信息,又发现了儿子的可疑事件,,就可以基本上确认儿子抽烟了,即使她的母亲对其一开始就很信任。

这就是贝叶斯定理的原理:简单来说就是通过信息不断更新先验概率的过程

其实我们小时候听过的故事———狼来了,就很形象的描述了这一过程

	《狼来了》寓言故事是出自古希腊伊索所著的《伊索寓言》中。
	该故事讲述了一个放羊的孩子喜欢撒谎,两次通过告诉村里人说狼来了,骗取村民急忙赶来,而这个孩子还以此为乐。
	村民们由于受骗而不再相信孩子的话,有一天,狼真来了,孩子呼救,没人相信,孩子的羊被狼吃光。

从贝叶斯定理我们可以看出,先验概率是无论是5%或者80%,只要们有足够多的证据,概率一定会收敛在事实附近
但是有一种情况是贝叶斯无法判断的,那就是极端情况,如下:
在这里插入图片描述
从这里我们可以得到些许反思,一个人不要有极端思想,否则,任何东西都输入不到你的观念中,从而变得狭窄落后,闭关锁国就是经典的例子。

贝叶斯定理在我们机器学习中有许多应用场景,如下:
1.自然语言处理:‌在自然语言处理中,‌贝叶斯公式用于求解语句中的概率关系,‌对语句进行分类和聚类,‌并预测语句可能的未来发展情况。‌这有助于实现理解、‌生成和检索等多种功能。‌
2.文本分类:‌贝叶斯方法可以用于识别、‌分类主题性文本,‌例如新闻报道分类或公司新闻等。‌
3.信用评分:‌在信用评分系统中,‌高斯朴素贝叶斯(‌GaussianNB)‌模型是一种广泛应用的机器学习算法。‌该模型基于朴素贝叶斯理论,‌假设特征之间相互独立,‌并且每个特征都服从高斯分布(‌正态分布)‌。‌例如,‌在银行构建的自动化的信用评分系统中,‌GaussianNB模型通过收集大量用户的信用数据,‌学习到各个特征与信用好坏之间的关系及其概率分布。‌

2. 贝叶斯公式模型的理解

在学习贝叶斯公式时,需要了解两个公式
1、全概率公式:
P ( B ) = P ( A 1 ) P ( B ∣ A 1 ) + P ( A 2 ) P ( B ∣ A 2 ) + P ( A 3 ) P ( B ∣ A 3 ) + . . . . + P ( A n ) P ( B ∣ A n ) P(B)=P(A_1)P(B|A_1)+P(A_2)P(B|A_2)+P(A_3)P(B|A_3)+....+P(A_n)P(B|A_n) P(B)=P(A1)P(BA1)+P(A2)P(BA2)+P(A3)P(BA3)+....+P(An)P(BAn)
2、贝叶斯公式:
P ( A i ∣ B ) = P ( A i ) P ( B ∣ A i ) ∑ j = 1 n P ( A j ) P ( B ∣ A j ) = P ( A i ) P ( B ∣ A i ) P ( A 1 ) P ( B ∣ A 1 ) + … + P ( A n ) P ( B ∣ A n ) P\left(A_{i} \mid B\right)=\frac{P\left(A_{i}\right) P\left(B \mid A_{i}\right)}{\sum_{j=1}^{n} P\left(A_{j}\right) P\left(B \mid A_{j}\right)}=\frac{P\left(A_{i}\right) P\left(B \mid A_{i}\right)}{P\left(A_{1}\right) P\left(B \mid A_{1}\right)+\ldots+P\left(A_{n}\right) P\left(B \mid A_{n}\right)} P(AiB)=j=1nP(Aj)P(BAj)P(Ai)P(BAi)=P(A1)P(BA1)++P(An)P(BAn)P(Ai)P(BAi)
3、联合概率公式(为了解释几个事件同时发生的概率,例如只有两个事件A、B):
P ( A , B ) = P ( A ∣ B ) ∗ P ( B ) = P ( B ∣ A ) ∗ P ( A ) P(A,B) = P(A|B)*P(B) = P(B|A)*P(A) P(A,B)=P(AB)P(B)=P(BA)P(A)

在这个基础上,我们用模型图来理解贝叶斯公式:
在这里插入图片描述

3. 朴素贝叶斯法(Naive Bayes model)

下面我们学习一下机器学习中经常提到的Naive Bayes model(朴素贝叶斯法)
朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。
虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。所以在机器学习中其算法可以用来处理大量的数据。

我们上面的2.1例子中,讲的都是一个特征判断一个事件(只通过是否有打火机来判断是否抽烟),假设我们有多个特征要怎么处理呢?
这个时候就要用到我们的朴素贝叶斯分分类算法,我们用一个买瓜的例子进行理解学习。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
还有很多贝叶斯算法,因为时间有限,后续我们继续研究学习。

Pytorch——TensorBoard学习

1.TensorBoard的安装

使用TensorBoard有利于我们探究模型在不同阶段的输出。例如运行完一个方法之后,想要看看运行后的图像,就可以使用TensorBoard。
我们在pycharm中的terminal安装我们TensorBoard(也可以在anaconda进入pytorch环境安装)
在这里插入图片描述
输入,如下指令:

pip install tensorboard

显示如下图红框部分,证明安装成功
在这里插入图片描述

我们继续打开我们之前学习的learn_pytorch文件,并创建一个python文件(test_tb.py)
在这里插入图片描述
然后在里面输入如下内容

from torch.utils.tensorboard import SummaryWriter

在这里插入图片描述
按住ctrl + 鼠标左键点击SummaryWriter可以查看用法(也可以在控制台使用help()函数查看,但是Pycharm方便)

可以看到,这个SummaryWriter的作用就是,直接向一个文件夹(log_dir,也可以自己命名)写入一个事件文件,这个事件文件可以背TensorBoard解析。
在这里插入图片描述
然后下面就是其每个参数说明
最常用的是第一个(log_dir),就是保存文件的位置,其有默认的位置叫做保存目录位置。
默认值为runs/CURRENT_DATETIME_HOSTNAME(现在的时间以及主机名),它在每次运行后都会发生变化(因为时间是不断变化的)。
在这里插入图片描述
这里是使用的例子:
1、什么都不加,就会给个默认的命名以及位置(默认的事件文件就会保存在runs…那里)
2、对其初始化,就会保存在对应的位置
3、对其加入一些参数,例如:comment,后面就会加上对应的文字。
的其中图中的LR(Learning Rate)表示学习率; BATCH(Batch size,是指在训练神经网络时,‌一次提供给模型的数据的数量)

	关于Batch size
	在训练神经网络的过程中,‌模型需要对整个训练数据集进行训练,‌但由于数据集通常很大,‌如果一次把整个数据集提供给模型训练,‌可能会导致内存不足或运算时间过长
	因此,‌我们通常将数据集分成若干个Batch,‌每次提供一个Batch给模型训练。‌Batch size就是指一个Batch中数据的数量。‌

在这里插入图片描述
了解了其用法后,我们就可以开始使用了。
写入如下代码:

from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter('logs') #使用SummaryWriter,输出文件在logs

writer.add_image() #图片
writer.add_scalar() #数值

writer.close() #关闭

2. add_scalar()的使用

如果我们想要输出这样的loss图
我们可以使用其默认的输出图片方式,所以我们可以把write.add_image()注释掉
重点关注我们的writer.add_scalar()
在这里插入图片描述
可以看到,在add_scalar的使用说明中,有许多参数,例如:
tag:就是图片的标题
scalar_value:需要保留的数值(图片的纵轴(Y轴)值)
global_step:记录总共进行了多少步(图片的横轴(X轴)值)
在这里插入图片描述
scalar_value与global_step在图中效果所示:
在这里插入图片描述
我们在 test_tb python文件中输入:

from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter('logs')  # 使用SummaryWriter,输出文件在logs

writer.add_image()  # 添加图片

#y=x图像
for i in range(100):
    writer.add_scalar("y=x", i, i)  # 第一个参数是tag、第二个参数是y轴值、第三个参数是x轴值

writer.close()  # 关闭

运行后的结果:
可以看到生成了一个logs文件夹,里面就是刚刚生成的文件

接下来我们需要利用指令去打开它,在控制台新建一个local,再输入如下指令:

tensorboard --logdir=logs #logdir是事件文件所在文件夹名字

可以看到TensorBoard打开的窗口在主机的6006.
在这里插入图片描述

注意:主机名最好不用用英文,否则会出现编码错误
可以在设置–系统–重命名 进行改名,再重新运行程序
在这里插入图片描述

如果多人做训练,同时访问一个端口可能会引发错误,所以我们也可以通过参数设置,指定端口变成6007
在这里插入图片描述
我们访问这个网站,就可以看到我们做的图片了,我们可以点击下面的选项,来对图片进行操作
在这里插入图片描述
在这里插入图片描述
我们可以继续修改参数,画一个y=2x的图片:

from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter('logs')  # 使用SummaryWriter,输出文件在logs

# writer.add_image()
# y=2x
for i in range(100):
    writer.add_scalar("y=2x", 2*i, i)  # 第一个参数是tag、第二个是x
writer.close()  # 关闭

图片如下:
在这里插入图片描述
但是,使用TensorBoard会造成一个问题
比如我们继续画一个y=3x的图片,但是不修改tag参数

for i in range(100):
    writer.add_scalar("y=2x", 3*i, i)  # 第一个参数是tag、第二个是x

会导致这样的情况,可以看到两个函数在拟合:
在这里插入图片描述
在这里插入图片描述
可以看到,我们使用write时,写入一个新的事件,其实也进入了上一个事件当中,就会出现上述情况。
遇到这种问题要怎么解决呢?
官方的建议是删掉原来的文件以及进程,再重新运行
(重新运行运行tensorboard --logdir=logs #logdir)

或者
把为每一个新的图像时候创建一个子文件夹
子文件,也就是创建新的SummaryWriter(“新文件夹”)
在这里插入图片描述

3. add_image()的使用

为了在里面写入图像,我们需要学习add_image()的使用

首先,先下载练手数据集,后解压重命名为data后,存放到pytorch项目文件中。
练手数据集下载地址(百度网盘):
https://pan.baidu.com/s/1jZoTmoFzaTLWh4lKBHVbEA 密码: 5suq
在这里插入图片描述
接下来,我们看看add_image()的用法。
可以看到image里面也有tag、img_tensor、step等等参数,都和上面的scalar差不多
其中,值得注意的是img_tensor,它规定的的格式有torch.Tensor、numpy.array或者字符串
在这里插入图片描述
接下来,我们输入如下代码进行运行:

from torch.utils.tensorboard import SummaryWriter
from PIL import Image
import numpy as np

writer = SummaryWriter('logs')  # 使用SummaryWriter,输出文件在logs

image_path = "data/train/ants_image/0013035.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)

writer.add_image("test", img_array, 1)

# y=2x
for i in range(100):
    writer.add_scalar("y=2x", 2 * i, i)  # 第一个参数是tag、第二个是x

writer.close()  # 关闭

发现报了如下错误,是说TypeError: Cannot handle this data type(不能处理这类数据)
在这里插入图片描述
我们倒回到add_image()方法查看用法
可以看到,图片经过npy处理后是有格式的,分别为HWC排序,我们需要弄清楚我们这三个参数是怎么排序的,再加上dataformats='排序格式’的参数,再运行。
在这里插入图片描述
可以看到,我们的图片型式是HWC
在这里插入图片描述于是我们加上参数HWC(dataformats=‘HWC’)得

from torch.utils.tensorboard import SummaryWriter
from PIL import Image
import numpy as np

writer = SummaryWriter('logs')  # 使用SummaryWriter,输出文件在logs

image_path = "data/train/ants_image/0013035.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)
writer.add_image("test", img_array, 1, dataformats='HWC')

# y=2x
for i in range(100):
    writer.add_scalar("y=2x", 2 * i, i)  # 第一个参数是tag、第二个是x

writer.close()  # 关闭

再在terminal上运行

tensorboard --logdir=logs --port=6007   

运行结果:
在这里插入图片描述
在这里插入图片描述
我们修改python加入蜜蜂图片,再运行:
在Tensorboard刷新之后,再滑动圆轮至step2,就得到黄蜂图片
在这里插入图片描述

总结

这一周,继续对李宏毅机器学习进行了学习,了解了机器学习的任务攻略图,其中学会了training data的loss偏大的情况下,判断是model bias还是optimization问题。又对overfitting进行深度的学习。最后还学会了如何利用Cross Validation与N-fold Cross Validation挑选Model。紧接着还学习了贝叶斯专题,更深层次的理解了贝叶斯定理,从抽烟概率的例子和贝叶斯图像模型的角度深度理解了贝叶斯定理的含义,以及用贝叶斯思维引申出后面值得深思的问题,然后还对机器学习常用的朴素贝叶斯定理进行了学习,主要是为了解决多特征的分类问题。最后还学习了Pytorch中TensorBoard的运用,其中因为系统中文名(微软自动设置的)导致了很多package的安装产生了编码和路径错误,后面对系统进行了重装花费了大量的时间,因为上个星期没有学习Pytorch,所以这个星期无论如何都要辛苦的肝一下,这次学会了add_image()与add_scalar()函数的使用,以及图像展示,为接下来的训练做准备。
下一周计划继续对机器学习视频进行学习,然后继续学习Pytorch的transform使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 最大连接数及最大并发数是多少

SpringBoot 最大连接数及最大并发数 Spring Boot 是一个基于 Spring 框架的快速开发框架,它本身并不直接管理数据库连接或网络连接的最大连接数和最大并发数。这些参数通常由底层的基础设施和组件来控制,例如: 数据库连接池:Spri…

git实操之线上分支合并

线上分支合并 【 1 】本地dev分支合并到本地master上 # 本地dev分支合并到本地master上# 远程(线上)分支合并# 本地dev分支合并到本地master上# 远程(线上)分支合并#####本地和线上分支同步################ #### 远程创建分支,拉取到本地####-远程创建分支&#…

健康问题查询找搜索引擎还是大模型

随着自然语言处理(NLP)的最新进展,大型语言模型(LLMs)已经成为众多信息获取任务中的主要参与者。然而,传统网络搜索引擎(SEs)在回答用户提交的查询中的作用远未被取代。例如&#xf…

PHP手边酒店多商户版平台小程序系统源码

🏨【旅行新宠】手边酒店多商户版小程序,一键解锁住宿新体验!🛌 🌈【开篇:旅行新伴侣,尽在掌握】🌈 还在为旅行中的住宿选择而纠结吗?是时候告别繁琐的搜索和比价过程&a…

Linux——Shell脚本和Nginx反向代理服务器

1. Linux中的shell脚本【了解】 1.1 什么是shell Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁 Shell 既是一种命令语言,有是一种程序设计语言 Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问…

《系统架构设计师教程(第2版)》第12章-信息系统架构设计理论与实践-02-信息系统架构

文章目录 1. 概述1.1 信息系统架构(ISA)1.2 架构风格 2. 信息系统架构分类2.1 信息系统物理结构2.1.1 集中式结构2.1.2 分布式结构 2.2 信息系统的逻辑结构1)横向综合2)纵向综合3)纵横综合 3. 信息系统架构的一般原理4…

Adobe Premiere Pro(Pr)安装包软件下载

一、简介 Adobe Premiere Pro(简称Pr)是由Adobe公司开发的一款功能强大的视频编辑软件。它支持多平台使用,包括Windows和Mac系统,并且拥有良好的兼容性和高效的性能。Premiere Pro不仅提供了视频剪辑、特效添加、音频处理等基本功…

【附源码】IMX6U嵌入式Linux开发板连接阿里云--MQTT协议

演示 IMX6U嵌入式Linux开发板连接阿里云 阿里云创建设备&&获取LinkSDK 如果还不知道怎么在阿里云创建设备和获取连接阿里云的LinkSDK的话,先看这篇文章,再到这里。看这篇文章的时候,麻烦将下方文章打开对照着看,因为一些…

pdf提取其中一页怎么操作?提取PDF其中一页的方法

pdf提取其中一页怎么操作?需要从一个PDF文件中提取特定页码的操作通常是在处理文档时常见的需求。这种操作允许用户选择性地获取所需的信息,而不必操作整个文档。通过选择性提取页面,你可以更高效地管理和利用PDF文件的内容,无论是…

ICMP 和 IGMP 的区别

ICMP 和 IGMP 协议 IP 层分支图 ICMP(Internet Control Message Protocol,因特网控制信息协议) 用于补充 IP 传输数据报的过程中,发送主机无法确定数据报是否到达目标主机。 ICMP 报文分为出错报告报文和查询报文两种。 若数据…

【题解】—— LeetCode一周小结29

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结28 15.账户合并 题目链接:721. 账户合并 给定一个…

C++初阶:模版初阶【范式编程】【函数模板】【类模板】

一.范式编程 我们在写C函数重载的时候,可能会写许多同一类的函数。 比如交换函数: void Swap(int& left, int& right) {int temp left;left right;right temp; }void Swap(double& left, double& right) {double temp left;left …

环信IM x 亚马逊云科技,助力出海企业实现可靠通讯服务

随着全球化进程的加速,越来越多的企业选择出海,拓展国际市场。然而,面对不同国家和地区的用户,企业在即时通讯方面遇到了诸多挑战。为了帮助企业克服这些困难,环信IM与亚马逊云科技强强联手,共同推出了一套…

One-Class SVM

前提知识:支持向量机(SVM)-CSDN博客 主要思想 找一个超平面将样本中的正例圈出来,预测就是用这个超平面做决策,在圈内的样本就认为是正样本,圈外的是其他样本,如图1所示: 图1 OSVM…

docker安装jenkins,并配置node和maven

准备 需提前安装好Docker 由于国内docker镜像无法正常使用,需提前做好代理,否则无法正常拉取镜像 开始 拉取jenkins镜像 docker pull jenkins/jenkins:2.468-jdk21 创建一个文件夹,用于二次打包jenkins镜像 mkdir -p /data/jenkins cd /…

神经网络中如何优化模型和超参数调优(案例为tensor的预测)

总结: 初级:简单修改一下超参数,效果一般般但是够用,有时候甚至直接不够用 中级:optuna得出最好的超参数之后,再多一些epoch让train和testloss整体下降,然后结果就很不错。 高级:…

【人工智能】机器学习 -- 贝叶斯分类器

目录 一、使用Python开发工具,运行对iris数据进行分类的例子程序NaiveBayes.py,熟悉sklearn机器实习开源库。 1. NaiveBayes.py 2. 运行结果 二、登录https://archive-beta.ics.uci.edu/ 三、使用sklearn机器学习开源库,使用贝叶斯分类器…

Raid5数据恢复—Raid5热备盘同步失败导致通用卷不可用的数据恢复案例

Raid5算法: Raid5算法也被称为“异或运算”。异或是一个数学运算符,它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。异或的运算法则为:a⊕b (a ∧ b) ∨ (a ∧b)。如果a、b两个值不相同,则异或结果为…

探索XEX数字资产交易的优势与操作指南

随着数字资产市场的快速发展,越来越多的投资者开始关注并参与其中。XEX交易所作为一个新兴的数字资产交易平台,以其用户友好的界面和高效的交易服务,迅速吸引了大量用户。本文将介绍XEX数字资产交易的主要特点和优势,帮助新手更好…

[Spring Boot]Protobuf解析MQTT消息体

简述 本文主要针对在MQTT场景下,使用Protobuf协议解析MQTT的消息体 Protobuf下载 官方下载 https://github.com/protocolbuffers/protobuf/releases网盘下载 链接:https://pan.baidu.com/s/1Uz7CZuOSwa8VCDl-6r2xzw?pwdanan 提取码:an…