pytorch에서 stack과cat의 및 to_tensor의 구덩이

컴퓨터 시각에 처음 들어온 구덩이들


1.pytorch 중전 tensor


x=np.random.randint(10,100,(10,10,10))
x=TF.to_tensor(x)
print(x)
이 함수는 입력 데이터에 대해 자동으로 귀일화될 수 있다. 예를 들어 때때로 우리가 0-255의 그림을 numpy 형식의 데이터로 바꾸어야 한다면 0-1 사이로 자동으로 바뀔 수 있다.

2.stack과cat 사이의 차이


stack

x=torch.randn((1,2,3))
y=torch.randn((1,2,3))
z=torch.stack((x,y))# dim=0
print(z.shape)
#torch.Size([2, 1, 2, 3])
그래서 stack의 다음 데이터도 잘 이해가 돼요. z[0,...]의 데이터는 x,z[1,...]의 데이터는 y입니다.
cat

z=torch.cat((x,y))
print(z.size())
#torch.Size([2, 2, 3])
cat 이후의 데이터 z[0,::]는 x의 값이고, z[1,::]는 y의 값입니다.
그 중에서 가장 관건적인 것은 stack 이후의 데이터의size가 한 차원 더 많아진다는 것이다.cat는 그럴 수 없다. 간단한 예가 하나 있다. 예를 들어 검측 모델을 훈련시키려면 label은 일부 표기점이다.eg:[x1, y1, x2, y2]
네트워크에 전송된batchsize를 합치면 Size: [batchsize, 4]. 만약에 내가 두 무더기의 데이터를 가지고 있다면 데이터1: Size[128,4], 데이터2: Size[128,4], 이 두 데이터를 합쳐야 한다면 목표 데이터: Size[256,4].
분명히 우리가 해야 할 일은: torch.cat((data1,data2))
만약 우리의 데이터가 이렇다면: 100개의 레이블이 있고, 각각의 레이블은list(data)에 넣고, [x1, y1, x2, y2], [x1, y1, x2, y2],...]그 중에서 데이터는list의 길이가 100이고list의 모든 요소는 그림의 라벨입니다.size는[4]입니다. 우리는 그들을 합쳐서 1Size:[100,4]의 데이터가 되어야 합니다.
분명히 우리가 해야 할 일은 torch이다.stack(data).그리고 토치.stack의 입력 매개 변수는list 형식입니다!
추가:pytorch의cat,stack,tranpose,permute,unsqeeze
pytorch에서tensor에 자주 사용되는 변환 작업을 제공합니다.

cat 연결


데이터에 대해 어떤 차원을 따라 조립하다.cat 이후 데이터의 총 비트는 변하지 않습니다.
예를 들어 아래 코드는 두 개의 2차원tensor(각각 2*3, 1*3)를 조립하고 조립이 끝난 후에 3*3이나 2차원tensor로 변한다.
코드는 다음과 같습니다.

import torch
torch.manual_seed(1)
x = torch.randn(2,3)
y = torch.randn(1,3)
print(x,y)
결과:
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x3]
-1.5228 0.3817 -1.0276
[torch.FloatTensor of size 1x3]
두 개의 tensor를 한데 묶음:

torch.cat((x,y),0)
결과:
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
-1.5228 0.3817 -1.0276
[torch.FloatTensor of size 3x3]
더욱 유연한 맞춤법:

torch.manual_seed(1)
x = torch.randn(2,3)
print(x)
print(torch.cat((x,x),0))
print(torch.cat((x,x),1))
결과
//x
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x3]
//torch.cat((x,x),0)
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 4x3]
//torch.cat((x,x),1)
0.6614 0.2669 0.0617 0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661 0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x6]

stack, 새로운 차원을 늘려 쌓기


스택은 새로운 차원을 증가시킨다.
만약에 두 개의 1*2차원의tensor가 0차원에서stack이면 2*1*2의tensor로 변한다.첫 번째 차원에서stack은 1*2*2의tensor로 변한다.
코드 참조:

a = torch.ones([1,2])
b = torch.ones([1,2])
c= torch.stack([a,b],0) //  0 stack
출력:
(0 ,.,.) =
1 1
(1 ,.,.) =
1 1
[torch.FloatTensor of size 2x1x2]

c= torch.stack([a,b],1) //  1 stack
출력:
(0 ,.,.) =
1 1
1 1
[torch.FloatTensor of size 1x2x2]

transpose, 두 차원 교환


코드는 다음과 같습니다.

torch.manual_seed(1)
x = torch.randn(2,3)
print(x)
원래 x의 결과:
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x3]
x의 차원을 교환하다

x.transpose(0,1)
결과
0.6614 0.6213
0.2669 -0.4519
0.0617 -0.1661
[torch.FloatTensor of size 3x2]

permute, 여러 차원 교환, 더욱 유연한transpose


permute는 더욱 유연한transpose로 원 데이터의 차원을 유연하게 바꿀 수 있고 데이터 자체는 변하지 않는다.
코드는 다음과 같습니다.

x = torch.randn(2,3,4)
print(x.size())
x_p = x.permute(1,0,2) #  1 0 , ,0→1,2→2
print(x_p.size())
결과:
torch.Size([2, 3, 4])
torch.Size([3, 2, 4])

squeeze와 unsqueeze


예를 들어batch 차원이 없을 때,batch 차원을 1로 늘리는 데 자주 쓰인다.
squeeze(dim_n) 압축, dim_ 감소n차원, 즉 원소 수량이 1인 dim_ 제거n차원.
unsqueeze(dim_n), dim_ 추가n차원, 원소 수량은 1이다.
위 코드:

#  
import torch

b = torch.Tensor(2,1)
b.shape
Out[28]: torch.Size([2, 1])

#  , 1 
b_ = b.squeeze()
b_.shape
Out[30]: torch.Size([2])

#  , 1, , 2 
b_ = b.squeeze(0)
b_.shape 
Out[32]: torch.Size([2, 1])

#  
b_ = b.squeeze(1)
b_.shape
Out[34]: torch.Size([2])

#  
b_ = b.unsqueeze(2)
b_.shape
Out[36]: torch.Size([2, 1, 1])
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.

좋은 웹페이지 즐겨찾기