转到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】