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])
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정확도에서 스케일링의 영향데이터셋 스케일링은 데이터 전처리의 주요 단계 중 하나이며, 데이터 변수의 범위를 줄이기 위해 수행됩니다. 이미지와 관련하여 가능한 최소-최대 값 범위는 항상 0-255이며, 이는 255가 최대값임을 의미합니다. 따...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.