Pytorch:dtype不一致问题如何解决


这篇“Pytorch:dtype不一致问题如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Pytorch:dtype不一致问题如何解决”文章吧。RuntimeError: Expected object of scalar type Double but got scalar type Float for argument #3 ‘mat2’ in call to _th_addmm_out在训练网络的过程中由于类型的冲突导致这种错误,主要是模型内部参数和输入类型不一致所导致的。主要有两个部分需要注意到:1.自己定义的变量要设置为一种数据类型;2.网络内部的变量类型也要统一。统一声明变量的类型。or一定要注意要在变量创建之间声明类型。在训练过程中加入一下两点即可:1. 用conda安装pytorch-gpu时用这个命令就够了,网上其他人说的都不好使注意得是清华源的2. 比较两个行向量或者列向量以期求得布尔数组时,必须要保证两边的数据类型一样,并且返回的布尔数组类型和比较的两个向量结构保持一致。另外,所有torch.返回的东西,如果要取得里面的值,必须要加.item()3. numpy转tensor,其中,ndarray必须是等长的4. unsqueeze (不改变原有数据)5. nn.embedding6. eq7. expand8. repeat9. torch.stack这个函数接受一个由张量组成的元组或者列表与cat的区别是,stack会先增加一维,然后再进行拼接10. 对于一维张量a,维度为m,a[None, :]的shape为1m,a[:, None]的shape为m111. 两个不同维度的矩阵比较,利用了广播机制12. torch.nn.CrossEntropyLoss(),这个类比较复杂,我们慢点说。首先,这是一个类,定义如下:可以看到这个类非常简单。在构造函数中,我们重点关注weight和reductionweight:表示每个类的权重,这个在样本不平衡分类问题中很有用,它应该是一个长度为C的一维张量,C为类别数。reduction:用于控制最终的输出结果,默认为mean,如果是mean,返回的是一个数,即shape为torch.tensor([]) ,如果是none,则返回的情况有两种,一种是(N,),一种是(N, d_1, …, d_K),至于是哪一种,得看我们输入到forward函数中的input和target是哪种形状的。可以看到,forward函数直接调用F.cross_entropy这个函数,这个函数中的weight和reduction我们已经讲过,不再赘述。我们重点将input和target应该是什么形状的。这里分两种情况。第一种,input是二维,即(N, C),N代表batch_size,C代表类别,即对于每一个batch,都有一个一维长度为C的向量,通常这里的C表示的是对应类别的得分。target表示标签,它应该是(N,),表示每一个batch的正确标签是什么,内容应该在0~C-1之中。如果reduction取默认值mean,则返回的是一个数,这个数是每个batch的损失的平均。如果是none,则返回的是(N,),即代表每一个batch的损失,没有进行平均。第二种,input的维度是(N, C, d_1, … d_K),这里K>=1。N表示batch_size,C表示类别数,d_1…d_K 可以看做一个整体,表示在某个批次,某个类别上,损失并不是一个数字,而是一个张量。按这种方式理解的话,第一种就可以理解为,在某个批次,某个类别上,损失是一个数,而第二种不是一个数,是一个张量,这个张量的形状是(d_1, …, d_K),这个张量的每一个位置都代表对应位置的损失。拿NLP中seq2seq的损失函数为例,decoder的输出应是(batch_size, seq_len, vocab_size),label为(batch_size, seq_len),那么这里我们显然应该用第二种,因为在某个批次,某个类别上,我们的损失函数并不单单是一个数,而是一个(seq_len,)的张量,对于长度为seq_len的每个单词,每个位置都有一个损失,所以我们要用第二种。所以这里,我们需要将input的后两维置换,即transpose(0, 1),使其变成(batch_size, vocab_size, seq_len)。对于第二种,target,也就是label的维度应该是(N, d1, …, d_K),表示对于每个批次,这个“损失张量”(这个名字我自己起的)的每个位置对应的标签。因此,对于seq2seq来说,label的维度应该是(N, seq_len)。对于第二种情况,如果reduction是mean,输出还是一个数,这个数表示所有批次,“损失张量”所有位置的损失的平均值。如果是none,输出为(N, d1, …d_K),表示每一个批次,“损失张量”每一个位置的损失。下面的例子代表第一种情况。13. torch中mask作为torch的下标,可以不必和torch一样的shape当然,也可以直接用下表来进行赋值14. repeat in torch & numpy is very different.look at the pic above, repeat in torch does not have a argument ‘axis =’, and it regard the whole tensor as one which can not be seperated.Next, we will talk about repeat function in numpy. We would like to divide it into two part. The former is that the array is 1-D and the other is N-Dpart 1:if array is one-dimensional, there is no need to specify the ‘axis’ argument. It will seperate each number, and repeat them respectively.part 2:Here the shape of array c is (2, 2), so we can specify the ‘axis’. The condition will be as follows:(1) If axis is not specified, it will firstly flatten the array and continue repeating operation which is like part 1.(2) If axis = 0, it will repeat along the first dimension.(3) If axis = 1, it will repeat along the seconddimension.15. torch的多维张量a,如果a[-1],默认代表第一axis的最后一维,即等价于a[-1,:,:,…,:]16. torch.cat(XXX, dim = ?) 其中XXX可以是list,不一定非要tensor17. contiguous()亦即,对tensor进行transpose时,其实是浅拷贝,如果要深拷贝,就要在后面补上一个contiguous()18. net是网络模型的一个object,调用zero_grad函数,表示将网络内部所有参数的梯度置019. torch.utils.data中的DataLoader和TensorDataset先用TensorDataset对打包的文件进行校对,在DataLoader中会指定b免费云主机域名atch_size,假设原本data和label各N个,那么DataLoader会将其打乱后,每batch_size为一组,共N/batch_size个。假设DataLoader返回的是iter,对iter进行for遍历的时候,假设每一轮取样为batch,则batch的长度是2,batch为一个list,这个list里面有两个元素,一个是data,一个是label,data和label的第一维大小都是batch_size。以上就是关于“Pytorch:dtype不一致问题如何解决”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注百云主机行业资讯频道。

相关推荐: MySql如何获取当前时间并转换成字符串

今天小编给大家分享一下MySql如何获取当前时间并转换成字符串的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。now();sysdate();My…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 05/14 17:54
下一篇 05/14 17:54

相关推荐