pytorch 代码笔记

转到pytorch之后,还没有系统的学习,然而在看一些源码的时候,还是遇到了不少由于版本以及API变动所带来的一些问题,然鹅网上关于这件事的相关资料较少,暂时记录一下,以后有空了再探究一下底层实现细节问题。

torch.cat()

  • input param:[ tuple, dim=]
  • return : tensor
  • problem describe:
    本来正常使用应该不会有什么问题,但是我在阅读源码的时候,遇到了一题提示错误:
    RuntimeError: zero-dimensional tensor (at position 0) cannot be concatenated

导致这个问题的code部分如下:

x = torch.tensor(0.5)
y = torch.tensor(0.4)
m = torch.cat((x, y))
>>  "RuntimeError: zero-dimensional tensor (at position 0)"

#  this is the right code:
x = torch.tensor([0.5])
y = torch.tensor([0.4])
m = torch.cat((x, y))
>>   m   tensor([0.5,  0,4])

也就是说这个问题的根本在于,torch.cat() 函数传入的tuple里面的tensor维度不可以为0,而我们直接创建一个非list的tensor的时候,就有了zero-dimensional tensor, 这在pytorch0.3 版本没有什么问题,但pytorch0.4版本中,加入了zero-dimensional tensor 的概念,做出了区分。

ps:之所以会这样,是因为我想要做concatenate操作的是一个tensor的浮点型数据,loss.data, 而loss.data 是一个tensor()类型, 跟tensor([])类型是完全不一样的!

int() float() str()

遇到的另一个问题就是如何把一个tensor 类型的数据,转为Python所能操作的对应的类型,需要注意的一点是,在pytorch0.4版本中,int和float对应的tensor都有对应的直接类型转换,但是没办法直接变成一个string类型!!!
直接来看几个例子吧:

>>   x = torch.tensor(0.5)
torch.tensor(0.5)    torch.size([])
>>  float(x)
0.5
>>  str(x)
'tensor(0.5000)'

>> str(float(x))
'0.5'

划重点啦,torch.tensor 是没办法直接转到str类型的!!!

seq2seq code

判断当前解码的句子是不是eos
>> input_sequence = torch.tensor([   87,   294,    87,   132,    21,     1,     1,  2978,    72, 87])
>> eos_id = 2
>> m = (input_sequence != eos_id)
Out[4]: tensor([ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1], dtype=torch.uint8)
解码出一个句子和一个序列

一般会使用torch.nn.GRU() 这个function来产生一个序列,输入时input和init_hidden state, 其中有个小技巧,就是,如果是在train的时候,我们输入的input的shape:【batchSize, sequence_length, dims】,那么如果我们需要做inference的时候怎么办呢?仔细想一想,其实区别只是在于,sequence不一样了,在infer的时候,每次的input只有当前词,所以输入的shape是:【batch_size, 1, dims】

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值