![](https://img-blog.csdnimg.cn/75609f534aba4b398f2360aea65e930f.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Pytorch深入理解与实战
文章平均质量分 64
深入理解Pytorch,代码也一起干起来。
音程
这个作者很懒,什么都没留下…
展开
-
Pytorch如何使用RNN而不是RNNCell进行单步(迭代,递归)更新
一种方法当然是用回RNNCell,但是之前训练模型的时候用的是RNN,不方便换回去重新训练RNNCell,现在想在RNN基础上加一个递归的功能。后来直接使用RNN了,可以输入多个位置的输入,直接得到最后一个位置的隐状态。以前初学的时候是使用的RNNCell,是用来迭代的,接收的是两个参数,一个是当前位置输入,一个是之前隐状态,然后就更新得到新的状态。得到的结果的含义,前面已经说了,我们现在的任务是,能不能利用RNN递归地得到上述结果呢?结果如下,可以看到,和之前的结果一模一样。注:初始化的隐状态是0。原创 2024-01-19 17:25:11 · 426 阅读 · 0 评论 -
(dgl的使用)查看节点的邻居
根据图g,查看节点的邻居,可以统一使用采样包,为什么呢?因为当采样数量为-1的时候,表示采样该节点所有邻居,那么也就是查看节点的邻居。其中fanout填-1就行,这个参数表示采样多少个邻居节点的意思。原创 2023-06-06 10:47:22 · 979 阅读 · 0 评论 -
(快速搞懂)Pytorch中的nan和inf有什么区别?
inf是一个数字,表示正无穷大,相应的,有-inf。由于是数字,所以可以和其他数字比较大小。产生原因:数字太大,计算机无法表示。我们发现,有的时候,我们使用torch计算一通之后,有的时候得到的是nan,有的时候得到的inf,这是什么鬼?开门见山,nan不是一个数字,因此没有正负概念,和其他数字比较也没有意义。注意:nan由于不是数字,因此任何后续数学运算都会是nan。注意,其是一个数字,因此,可以作为一个数字继续参与后续运算。成功,大家可以试一试,如果b为nan是无法参加后续运算的。原创 2023-01-01 17:31:11 · 4475 阅读 · 0 评论 -
(Pytorch)梯度剪裁(clip_grad_value_与clip_grad_norm_)
梯度剪裁,一种避免梯度爆炸的方式。转载 2022-12-16 15:39:08 · 8514 阅读 · 2 评论 -
(Pytorch)简单了解torch.autograd.grad()以及torch.autograd.backward()
这个时候,我们就可以用上grad_outputs,这个东西就会充当dz/dy的作用,那么我门只需要求解dy/dx即可,然后相乘,(dz/dy)*(dy/dx)=dz/dx,就得到了我们最终想要的。看起来平平无奇对不对,但是,计算谁对谁的梯度, 通过这个函数,你可以自由控制啦。然后,我们再说一下其中的参数grad_outputs,其他的比如retain_graph我们就不说了,这个东西我早在其他文章说过,属于必修内容。y和dzdy需要形状相同,这其实本来就一定要啊,对y的导数和y的数量当然是一样的。原创 2022-11-01 20:11:11 · 9044 阅读 · 3 评论 -
(一分钟)简单介绍MLFLOW
MLFLOW有很多功能,但是大家来找的应该是指其记录(追踪)超参数的功能。本文也只是简单说说这个,让你有一个大致了解。原创 2022-10-23 10:52:07 · 1422 阅读 · 0 评论 -
简单介绍ogb包(open graph benchmark)(图神经网络的基准数据集)
Open Graph Benchmark (OGB) 是一个图深度学习的基准数据集。原创 2022-10-20 11:27:38 · 4390 阅读 · 0 评论 -
(Pytorch)如何指定维度地判断两个tensor是否相同
的二维矩阵,我们要判断a,b是否行向量对应相同,返回两个bool值。那么true表示两个对象行向量不相等,false表示相等。但是,现在我们的场景不一样了,例如:a,b都是相同形状。这个时候该怎么办呢?原创 2022-10-10 14:49:33 · 2961 阅读 · 0 评论 -
(Pytorch)nn.Dropout以及Dropout1d,Dropout2d,Dropout3d是什么意思
其实nn.Dropout并不是Dropout1d,Dropout2d,Dropout3d中任何一个的特例,他们应用场景并不相同,不是相互包含的关系。原创 2022-10-09 15:22:14 · 4740 阅读 · 0 评论 -
Pytorch中Dataset的__getitem__()返回值应该怎么写
确实,功能上是等价的,但是有的时候,当你返回的东西特别多并且各部分功能不一样的时候,上面分组就会很方便。并且,我们dataloader返回的结果,也将会是分组的,非常之方便。,那么dataloader返回的结果也会是嵌套的,反正不会乱掉。经过这次,确实更加了解了dataloader的强大的组织为批的能力。我以前还实现过collate_fn,现在看来,无法处理多组以及嵌套的情况,今天发现,原来可以返回多组,太自由了。甚至:还可以更加复杂的,例如嵌套,后来发现,原来一组不一定是由。组成,可以是任意的,例如。原创 2022-10-09 11:24:33 · 2670 阅读 · 0 评论 -
(完美解决)为什么在train/val/test数据集上用train模式效果都很好,但是在eval模式下全部很差
因此,一个简单的对比就是,你在你的模型训练了好几轮,觉得效果不错了之后,停下来,选择几个训练集数据,比如5个,分别在train模式和eval模式下,打印他们输入,中间层以及结尾的结果,这个你自己看着办即可。在train模式下好,eval模式下差,我们可以理解为train模式下,最后一层得到的那一堆向量好,eval得到的那一堆向量差,从而逐步往前推。不管怎么说吧,首先引人注目的就是,我的4个数据,输入的均值和方差都特别不一样,尤其是方差,3万多的方差,吓死。成功了,同时发现,归一化之后训练得很快!...原创 2022-07-26 15:28:28 · 2365 阅读 · 0 评论 -
pytorch中设置不要记录梯度传播信息的三种方式(torch.no_grad/@torch.no_grad/set_grad_enabled)
这个东西和那个with torch.no_grad()一样的作用。原创 2022-05-07 15:05:15 · 2507 阅读 · 0 评论 -
pytorch如何对已有数据进行正态分布标准化(正则化)处理
最近看了很多的文章写的都是如何生成一个随机的矩阵,并且按照正态分布来随机生成,这个太没意思了,早就知道了。现在的问题是:我们已经有了数据,如何对其进行正态分布正则化,找了好久都没有找到api。别跟我说什么batch normalization哈,那个是有训练参数的,我只是想要一个普通的标准化而已。除了sklearn外,pytorch我实在是没有找到,于是干脆自己写一下,反正也是非常利落的。如下:import torchdef norm(x): #[bsize,seq_len] me原创 2022-05-01 10:55:29 · 2019 阅读 · 0 评论 -
(已解决)torch中如何来表示正负无穷大以及如何判定是否为正负无穷大以及应用例子
文章目录背景方法科学计数法字符串判定例子背景有的时候我们需要用到正负无穷大。比如标准化的时候,就有无穷范数的概念。import torchimport torch.nn.functional as tnf方法科学计数法用一个非常大的数字,然后超过计算机的表示,那么这个数字就会自动转为无穷大。表示非常大的数字,我们当然可以使用科学计数法,如下:a=torch.tensor([1.0e100])#加一个负号就是负无穷大。atensor([inf])字符串p=float("inf"原创 2022-05-01 09:41:34 · 3648 阅读 · 0 评论 -
TorchMetrics的安装以及使用
文章目录安装使用安装官方网站:https://torchmetrics.readthedocs.io/en/stable/。安装方法:conda install -c conda-forge torchmetrics使用大家如果用过sklearn.metrics,那么就会很容易使用这个,其实我一开始都是一直使用前者的,但是前者只支持numpy以及list,所以每次使用sklearn的使用,我们需要将tensor从gpu搬到cpu,然后再由tensor转化为numpy,现在的话,TorchMet原创 2022-04-25 20:23:08 · 10566 阅读 · 8 评论 -
conda如何添加,删除镜像channel,管理虚拟环境,以及其他常见命令。
1.添加镜像channel。conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/2.删除镜像channel。conda config --remove channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/3.展示目前已有的镜像channel。conda config --show channels原创 2021-03-22 12:07:41 · 46943 阅读 · 2 评论 -
deep graph library(dgl)库的进阶使用
文章目录边索引异构图常用api本文先讲解一些基础概念与机制,然后有了这些理解之后,我再直接列出常用api。import dgl边索引src=[1,2,3]dst=[3,4,1]g=dgl.graph((src,dst))注意上述,默认就是(1,3)的边索引为0,其他依次类推。异构图异构图就是节点有不同类型,边有不同类型的图。举个例子如下:data_dict = { ('user', 'follows', 'user'): (torch.tensor([0, 1]), torc原创 2022-04-24 16:39:45 · 2220 阅读 · 0 评论 -
模型的权值以及loss或者中间变量变成了nan怎么回事
文章目录前言原因解决办法前言一开始是因为中间变量变成了nan,不知道怎么处理,后来发现,权值以及loss其实也是nan,我就更加懵逼了。看了很多人说的方法,觉得说得不彻底,不通透。比如什么调小学习率之类的,治标不治本,各位看官也就图一乐呵。所以这里说点个人理解。原因为什么会造成这种情况呢?我举个例子,如果我们的模型是要使得两个词向量的内积越来越大,那么模型就会一直增大这两个词向量,使得这两个模型参数会变成nan,同时内积变成nan,loss也会变得无限小。解决办法那么我们该怎么办呢?我认为最原创 2022-04-21 15:33:28 · 1066 阅读 · 0 评论 -
简单讲解torch.sparse.LongTensor
文章目录前言构造属性和运算前言import torch当一个tensor有特别多0的时候,我们可以使用稀疏矩阵来存储,大家可能都听过的库是sicpy,不过,本文要讲的是torch。构造有大量0元素的时候,我们可以使用坐标形式存储稀疏矩阵,例如我们有一个3*3的矩阵,但是只有0,0处有值,值为1,其他地方全为0,那么我们只需要如下做即可:i = torch.LongTensor([[0], [0]])v = torch.FloatTensor原创 2022-04-08 11:13:46 · 5673 阅读 · 1 评论 -
torch_{geometric/scatter}中一些函数的用法(softmax,scatter,torch_geometric.nn.initsnn.inits)
文章目录前言torch_geometric.utils.softmaxtorch_scatter.scatter前言其实个人不是很建议学习这些关于图深度学习的库,我之前还用过另外一个库DGL,也是五花八门的快速实现一个GNN,但是我的感觉是还不如自己写。用他们的API是非常头疼的,有的没有官方文档。本文并不是我自己决定学习这个库而写出来的,而是因为别人的代码用了,但我不知道什么意思,所以看了一下,顺便记录下来。反正个人不推荐使用。torch_geometric.utils.softmaxfrom t原创 2022-03-30 18:24:32 · 3026 阅读 · 1 评论 -
深入理解padding_idx(nn.Embedding、nn.Embedding.from_pretrained)
文章目录参数含义这个参数出现在一些地方,例如:nn.Embedding、nn.Embedding.from_pretrained。import torchimport torch.nn as nnimport torch.optim as optim参数含义如下:padding_idx (int, optional) – If specified, the entries at padding_idx do not contribute to the gradient; therefor原创 2022-03-23 16:17:25 · 4166 阅读 · 3 评论 -
pytorch中tensor的unsqueeze()函数和squeeze()函数的用处
unsqueeze()用于增加一个维度a=torch.Tensor([1,2])print(a.shape)假设我们现在有一个22的矩阵b,要与a相乘,最规范的是应该a的维度要变成21才对,现在是2。所以要增加一个维度。使用tensor的一个函数unsqueeze(dim)。参数中指明哪一个维度要增加一维。我们要对a在第二维增加一个维度。a=a.unsqueeze(1)print(a.shape)定义一个矩阵b,可以与之矩阵相乘了。b=torch.Tensor([[1,2],[3,4原创 2020-12-01 17:29:19 · 10380 阅读 · 0 评论 -
Pytorch计算距离(例如欧式距离)torch.nn.PairwiseDistance
通常,我们计算欧式距离,例如[0,0]到[1,1]的距离为2\sqrt22。pdist = nn.PairwiseDistance(p=2)#p=2就是计算欧氏距离,p=1就是曼哈顿距离,例如上面的例子,距离是1.input1 = torch.randn(100, 128)input2 = torch.randn(100, 128)#上面两个形状要一样。output = pdist(input1,input2)#计算各自每一行之间的欧式距离。output.shapetorch.Size([原创 2022-03-12 11:06:09 · 12112 阅读 · 0 评论 -
什么意思IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)
这个报错有千万种可能,大家代码环境可能千差万别,因为这个是一个广泛型报错,不是那种专门某个包才会报的错。所以我只能跟你说这个报错是什么意思,然后你需要自己检查。原因:pytorch内部要求输入是2维以上的,但是你输入了一个1维的东西进来。这个时候索引就会出问题,比如a是一维的:a=torch.rand(2)print(a)tensor([0.7804, 0.5983])a.index_select(0,torch.tensor([0]))a.index_select(-1,torc原创 2022-03-12 10:54:24 · 3574 阅读 · 0 评论 -
深入理解pytorch中计算图的inplace操作
a=1print(id(a))a=2print(id(a))并不是在1的空间删除填上2,而是新开辟了空间。a=[1]print(id(a[0]))a[0]=1print(id(a[0]))这个是Inplace操作。embedding=nn.Parameter(torch.rand(2,3))d=nn.Parameter(torch.rand(3,3))user_embeddings=embedding.clone()user_embedding_input = user_emb原创 2022-03-11 11:37:56 · 4148 阅读 · 0 评论 -
Pytorch固定随机性
import randomimport torchimport numpy as npdef set_random_seed(seed=42): torch.manual_seed(seed)#torch的cpu随机性 torch.cuda.manual_seed_all(seed)#torch的gpu随机性 torch.backends.cudnn.benchmark = False#保证gpu每次都选择相同的算法,但是不保证该算法是deterministic的。 t原创 2022-03-07 16:48:17 · 862 阅读 · 0 评论 -
通过例子10分钟快速看懂pad_sequence、pack_padded_sequence以及pad_packed_sequence
前言import torchimport torch.nn as nnfrom torch.nn.utils.rnn import pad_sequencefrom torch.nn.utils.rnn import pack_padded_sequencefrom torch.nn.utils.rnn import pad_packed_sequence注意到上面的utils.rnn了没有?这几个函数“通常”都是用于RNN相关处理的。所以你得明白RNN的一些标准概念,然后5分钟你就能看懂了原创 2022-03-05 10:13:41 · 2893 阅读 · 1 评论 -
torch.var()、样本方差、母体方差
方差的分类这两者有显然的区别,为什么会有这个区别呢?区别有二,这两个区别互相联系,不可分割:数据的多少。上面这个只有一部分样本,而下面这个是有完整数据,即总体,母体。目的。你是要算这部分数据的方差,还是要估计总体的方差。如果是前者,那么使用母体方差公式,如果是后者,使用样本方差公式。进一步解释:当我们只有一部分样本的时候,显然我们是无法估计出完整数据的方差的(下面这个公式),所以,上面这个公式其实是一个近似估计,但是这个估计的期望是等于完整数据的方差的,即无偏估计。torch.varim原创 2022-02-28 15:52:12 · 9439 阅读 · 0 评论 -
torch.roll
原理:将tensor进行偏移。例如[1,2,3]变成[2,3,1],这个就是roll。又再如[1,2,3]变成[3,1,2]。前者向左偏移一个单位,后者向左偏移两个单位。明白了原理就很简单了。torch.roll(input, shifts, dims=None)实战import torchx = torch.tensor([[1, 2],[ 3,4]])print(x)torch.roll(x,1,-1)#表示最后一个维度上进行操作,并且向右偏移1个单位。print(x)to原创 2022-02-14 11:19:23 · 1160 阅读 · 0 评论 -
torch.unbind()
作用:对某一个维度进行长度为1的切片,并将所有切片结果返回。举个例子就知道了:import torchx = torch.tensor([[1, 2],[ 3,4]])torch.unbind(x,0)#第0个维度上进行长度为1的切片。结果:(tensor([1, 2]), tensor([3, 4]))应用减少代码量:m,n=torch.unbind(x,0)print(m)print(n)m,n=x[0],x[1]#虽然这个也可以,但是如果x的第一个维度很大,这个就很繁琐。原创 2022-02-14 10:16:56 · 7361 阅读 · 0 评论 -
torch.nn.functional.pad
作用用来对一个tensor进行填充。最典型的就是图片了,原来是2*2的,现在想要变成3*3的,那么就需要填充,此时有很多选择,例如是在原来的右上进行填充还是左下?又或者是左上?等等。这个函数就可以用来实现这些功能。torch.nn.functional.pad(input, pad, mode='constant', value=0.0)我们只关心第二个参数pad,其他不要管。pad是一个元组,格式如下:(1,1)表示在最后一个维度,前面填充1个0,后面填充1个0(1,0)表示在最后一个维.原创 2022-02-13 20:08:33 · 994 阅读 · 0 评论 -
torch.meshgrid
原理```pythontorch.meshgrid(*tensors)```这个是干嘛的?根据输入来创建网格的,例如你告诉我两个列表[1,2],[3],我们可以在二维直角坐标系上标上两个点(1,3),(2,3)。从我们学过的数学的角度来说,前面那个就是x定义域,后面那个就是y定义域。另外一个更加形象的如下:可以看到就是创建了一个网格,所以叫做meshgrid,其中mesh:网状物,grid:格子。补充一点的是,在我们上面的例子中,其输出是(1,3),(2,3)。但是在pytorch中还要.原创 2022-02-12 21:23:27 · 622 阅读 · 0 评论 -
(以pytorch为例)路径(深度)的正则化方法的简单理解-drop path
文章目录原理代码原理drop path的原理就是:对于一个输入进来的向量x=(0.4,−0.2)x=(0.4,-0.2)x=(0.4,−0.2)(不妨设),以p的概率随机将xxx所有元素置为0,,也就是说经过drop path之后,x=drop path(x)x只有两种可能:x=(0.4,−0.2)x=(0.4,-0.2)x=(0.4,−0.2)x=(0,0)x=(0,0)x=(0,0)可以看到,这和dropout逐元素失活不同,dropout可能产生结果:x=(0.4,0)x=(0.4原创 2022-02-11 20:01:12 · 2569 阅读 · 3 评论 -
pytorch中LambdaLR的作用
这个东西是为了可以按照我们的策略lr_lambda,随着训练趟数的增加,而学习率在不断变化,通常,学习率是在变小。scheduler=torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=- 1, verbose=False)我们只需要传入前两个即可,后面两个默认即可。optimizer, lr_lambda,我们关注的是上面第二个策略函数,第一个是预先定义好的,不需要管。这是一个以训练epoch为输入,学习率倍率原创 2022-02-10 21:35:26 · 3176 阅读 · 0 评论 -
pytorch中trunc_normal_原理
这个不是什么新的神奇的东西,很简单,如下:说白了就是利用正态分布生成一个点,如果这个点在[a,b]区间之外,那么就重新生成,直到在区间为止。在pytorch中,默认的参数,例如a,b如下:nn.init.trunc_normal_( tensor: torch.Tensor, mean: float = 0.0, std: float = 1.0, a: float = -2.0, b: float = 2.0,) -> torch.Tensor原创 2022-02-10 15:19:35 · 8544 阅读 · 0 评论 -
dgl库之高级用法dgl.DGLGraph.update_all
afd原创 2021-12-11 09:45:08 · 3019 阅读 · 1 评论 -
(初学必看)deep graph library(dgl)库的入门引导
文章目录前言简单?内置数据集定义模型定义dgl中的一个图前言下载这个库要去官方网站:https://www.dgl.ai/,网站上会给你下载命令,这有点像下载pytorch的时候。然后,官方网站提供了一些入门的例子。如果自己有能力,可以自行学习,就不用跟着我们这篇文章学习啦,网址见:https://docs.dgl.ai/tutorials/blitz/index.html。这个库基本是由中国人开发和维护的,我用了之后的感觉就是:还行。API定义得很人性,所以很容易学习。跟一个普通的库没有什么差别。原创 2021-12-09 20:06:29 · 7615 阅读 · 0 评论 -
pytorch之SmoothL1Loss原理与用法
文章目录官方说明:解读图像用法官方说明:解读我们直接看那个loss计算公式lnl_nln,可以发现,是一个分段函数,我们将绝对值差视为一个变量zzz,那么这个变量是大于0的,即分段函数只在大于等于0处有定义,有图像。我们再来看看分段点,就是beta。有意思的是,在分段函数和这个分段点有关,在第一个公式(左边分段函数)中,函数值小于等于0.5z0.5z0.5z,因为除了beta。右边分段函数中,大于等于0.5z0.5z0.5z。所以是连续的,所以叫做Smooth。而且beta固定下来的时候,当z原创 2021-12-06 10:22:15 · 9478 阅读 · 0 评论 -
深度学习之优化器篇
文章目录前言GDmomentumNesterov accelerated gradient (NAG)pytorch中SGD的momentum和Nesterov前言优化器是用来更新参数的,其以梯度,lr,参数parameters以及其他值例如动量作为输入,经过一系列变换,得到新的参数。而发展到如今,有很多的优化器,他们的不同之处就是这个变换的不同。我们仔细想象,变换的不同,其实也可以认为是侧重点不同,不同的优化器有各自的特点和用武之地,他们考虑的因素有如下:学习率能否动态变化。如果是固定的,那么原创 2021-11-06 19:29:00 · 847 阅读 · 0 评论 -
深入理解Pytorch之register_buffer
文章目录使用特点疑点本文很简短,因为这个很容易,特别是看过我之前pytorch深入理解系列的来说。使用import torch.nn as nnimport torchclass net(nn.Module): def __init__(self): super(net,self).__init__() self.register_buffer("a",torch.ones(2,3))#从此,self.a其实就是torch.ones(2,3)。 de原创 2021-10-31 10:36:18 · 9979 阅读 · 10 评论