概述
本文意在于记录短期学习中同僚总结的知识点,主要学习平台在伯禹https://www.boyuai.com/elites/course/cZu18YmweLv10OeV
Task01:线性回归;Softmax与分类模型、多层感知机(1天)
Task02:文本预处理;语言模型;循环神经网络基础(1天)
Task01:线性回归;Softmax与分类模型、多层感知机
线性回归
实现顺序
1.生成数据集
随机标签,指定参数,计算标准结果添加噪声
2.定义模型
3.定义损失函数
4.定义优化模型
5.训练模型
1)设置超参,初始化模型参数
2)每次迭代中,小批量读取数据,初始化模型计算预测值,损失函数计算插值,反向传播求梯度,优化算法更新参数,参数梯度清零
步骤
第一步,训练集
模型训练的过程其实就是在求【参数】的过程,我们先假定某类【模型】(比如决策树模型),然后用【训练集】来训练,学习到对应的最优的【参数】。但是,我们没有办法保证假设的那个【模型】是最优的,所以我们假设一堆的模型,然后用【训练集】分别对这些模型来进行训练,学习到每一个【模型】中分别对应的参数。
第二步,验证集/调参
通常来说,我们用【超参数】来控制模型的结构(例如正则项系数、神经网络中隐层的节点个数,k值等)。我们就可以找一些数据来训练和学习我们具体的超参数了。直接用【训练集】肯定是不行的,因为我们现在的每一个模型都是用【训练集】来学习出来的,他们在【训练集】上的效果已经很好了,继续用它们来训练超参数不会有太大的效果,所以说我们就选择了使用【验证集】来选择这些超参数。
最后,当我们学习到了【参数】和【非参数】后,我们就确定了我们具体的模型结构,这个时候我们再用一些数据来测试这个模型在新的数据上的效果。因此,我们就不能够使用之前已经使用过的数据了,而要选择一个全新的数据集即【测试集】。这个时候我们就要来看最后的结果怎么样,如果结果很好,那么说明一切顺利,但是如果结果很差,其中可能的一个原因就是我们事先假定的那一类的【模型】(比如我们最先选择的决策树模型)并不是适合来分析这些数据,因此哪怕我们选择出了这一堆决策树模型中最好的一个(超参数的选择过程),它的效果依旧不怎么样。
关于 读取数据部分的程序的解读
- 程序执行顺序:
for从函数data_iter中获得可迭代对象,调用next方法。
data_iter运行至 yield处,并return,此处 yield相当于return
for将值赋予X,y后,进行下一轮迭代,继续data_iter中的for循环 - 相关知识:
生成器: 带yield的函数是一个生成器(生成器是一类特殊的迭代器),而不是一个函数了,这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以调用next的时候,生成器接着上一步停止的地方开始,然后遇到yield后,return出要生成的数,此步就结束。
for item in Iterable
循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。
pytorch的函数:
初始化生成
torch.ones()/torch.zeros(),与MATLAB的ones/zeros很接近。
均匀分布
torch.rand(*sizes, out=None) → Tensor
返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数。张量的形状由参数sizes定义。
标准正态分布
torch.randn(*sizes, out=None) → Tensor
返回一个张量,包含了从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数。张量的形状由参数sizes定义。
torch.mul(a, b)是矩阵a和b对应位相乘,a和b的维度必须相等,比
如a的维度是(1, 2),b的维度是(1, 2),返回的仍是(1, 2)的矩阵。
torch.mm(a, b)是矩阵a和b矩阵相乘,比如a的维度是(1, 2),b的维度是(2, 3),返回的就是(1, 3)的矩阵
torch.Tensor是一种包含单一数据类型元素的多维矩阵,定义了7种CPU tensor和8种GPU tensor类型。
random.shuffle(a):用于将一个列表中的元素打乱。shuffle() 是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。
backward()是pytorch中提供的函数,配套有require_grad:
1.所有的tensor都有.requires_grad属性,可以设置这个属性.x = tensor.ones(2,4,requires_grad=True)
2.如果想改变这个属性,就调用tensor.requires_grad_()方法: x.requires_grad_(False)
import Timer
timer = Timer()
timer.start()
timer.stop() #直接打印间隔时间
shuffle用来打乱数据集顺序
range函数用法:range(start,end,step)
random.normal用法:
np.random.normal(loc=0.0, scale=1.0, size=None)
作用:生成高斯分布的概率密度随机数
loc:float
—— 此概率分布的均值(对应着整个分布的中心centre)
scale:float
——此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
——输出的shape,默认为None,只输出一个值
torch调用神经网络,nn.Sequential(…)与nn.Sequential(OrderedDict([…]))有什么不同?将网络放在一个字典里面了,这个操作有什么好处吗?
如果网络深度上千层时, 前种方法就变得很不实用了 而后种方法在网络很深时也方便拓展;个人理解后者有两种好处:一是可以自定义隐藏层的名字;二是在更深度的情况下支持拓展和方便从外部导入。
pytorch里 读取数据的线程数,是为了并行读取数据,加快拉取数据的速度
提问
-
.view 可以改变tensor的形状, 个人感觉类似于numpy.reshape
例如 y是(3,4)大小的矩阵 y.view(4,3) 就可以变成大小为(4,3)的矩阵, 当然也可以用(-1,3)和(4,-1) -
view()里面是可以输入tensor的size()吗
view可以转换数据维度,而具体如何转换就依据输入的参数(这里的size)
view的参数类型有view(n)、view(m,n)等 你可以实操一下就明白了 -
yield和index_select(0,j)这两个是什么意思?
yield与returnl类似,不同处是yield把函数变成生成器,可返回多次值 -
for X, y in d
最后
以上就是愤怒火为你收集整理的Task01、Task02的全部内容,希望文章能够帮你解决Task01、Task02所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复