torch.tensor拼接与list(tensors)

此文转载自:https://blog.csdn.net/weixin_43543177/article/details/110206274

Construct list(tensors)

创建一个包含张量的列表,以及2个张量如下:

import toroch

a = [torch.tensor([[0.7, 0.3], [0.2, 0.8]]), 
     torch.tensor([[0.5, 0.9], [0.5, 0.5]])]
b = torch.tensor([[0.1, 0.9], [0.3, 0.7]])
c = torch.tensor([[0.1, 0.9, 0.5], [0.3, 0.7, 0.0]])

To stack list(tensors)

堆叠之前对stack函数做一点说明。Stack操作,先升维,再扩增。参考stack与cat。对张量进行堆叠操作,要求张量的shape一致:

stack1 = torch.stack(a)  # default: dim=0, [2, 2, 2]
print(stack1)
stack2 = torch.stack((stack1, b), 0)
print(stack2)

output:

 tensor([[[0.7000, 0.3000],
     [0.2000, 0.8000]],
    [[0.5000, 0.9000],
     [0.5000, 0.5000]]])

RuntimeError: 
stack expects each tensor to be equal size, but got [2, 2, 2] at entry 0 and [2, 2] at entry 1

To concatenate list(tensors)

c = torch.cat([torch.stack(a), b[None]], 0)
# (2, 2, 2), (1, 2, 2) ⇒ (3, 2, 2)
print(c)

Output:

   tensor([
   [[0.7000, 0.3000],
     [0.2000, 0.8000]],

   [[0.5000, 0.9000],
     [0.5000, 0.5000]],

   [[0.1000, 0.9000],
     [0.3000, 0.7000]]])

但是,如果要使用stack替代上述cat操作,则会报错,因为stack要求两个输入的shape完全相同,而cat允许非拼接部分不同。除了torch.cat以外,也可以使用list.append完成以上操作。

a.append(b)
print(a)
a.append(c)
print(a)
[tensor([[0.7000, 0.3000],[0.2000, 0.8000]]),
tensor([[0.5000, 0.9000], [0.5000, 0.5000]]), 
tensor([[0.1000, 0.9000], [0.3000, 0.7000]])]

[tensor([[0.7000, 0.3000], [0.2000, 0.8000]]), 
tensor([[0.5000, 0.9000], [0.5000, 0.5000]]), 
tensor([[0.1000, 0.9000], [0.3000, 0.7000]]), 
tensor([[0.1000, 0.9000, 0.5000],
       [0.3000, 0.7000, 0.0000]])]

注意到,list.append()不仅可以堆叠同形状的tensors,而且可以容纳不同shape的tensor,是一个tensor容器!但是本人在使用过程中出现了以下 low-level 错误,请读者谨防:

    d = []
    d.append(a), d.append(b)
    print(d)

    e = a.append(b)
    print(e)  # 空的!

Output:

[[tensor([[0.7000, 0.3000],
        [0.2000, 0.8000]]), tensor([[0.5000, 0.9000],
        [0.5000, 0.5000]])], tensor([[0.1000, 0.9000],
        [0.3000, 0.7000]])]
None

list_x.append 过程中不会返回新的东西,只能从list_x中获取。
完结,撒花。

   

更多内容详见微信公众号:Python测试和开发

Python测试和开发

原文地址:https://www.cnblogs.com/phyger/p/14054622.html