pytorch 의 unsqueze 와 squeeze 의 용법 설명

\#squeeze 함수:배열 의 모양 에서 단일 차원 항목 을 삭제 합 니 다.즉,shape 에서 1 의 차원 을 제거 합 니 다.
\#unsqueeze()는 squeeze()의 역방향 작업 으로 하나의 차원 을 추가 합 니 다.이 차원 은 1 로 추 가 된 차원 을 지정 할 수 있 습 니 다.예 를 들 어 unsqueeze(a,1)는 1 차원 에서 추가 하 는 것 을 나타 낸다.

import torch 
a=torch.rand(2,3,1)       
print(torch.unsqueeze(a,2).size())#torch.Size([2, 3, 1, 1]) 
print(a.size())         #torch.Size([2, 3, 1])
print(a.squeeze().size())    #torch.Size([2, 3]) 
print(a.squeeze(0).size())   #torch.Size([2, 3, 1])
 
print(a.squeeze(-1).size())   #torch.Size([2, 3])
print(a.size())         #torch.Size([2, 3, 1])
print(a.squeeze(-2).size())   #torch.Size([2, 3, 1])
print(a.squeeze(-3).size())   #torch.Size([2, 3, 1])
print(a.squeeze(1).size())   #torch.Size([2, 3, 1])
print(a.squeeze(2).size())   #torch.Size([2, 3])
print(a.squeeze(3).size())   #RuntimeError: Dimension out of range (expected to be in range of [-3, 2], but got 3)
 
print(a.unsqueeze().size())   #TypeError: unsqueeze() missing 1 required positional arguments: "dim"
print(a.unsqueeze(-3).size())  #torch.Size([2, 1, 3, 1])
print(a.unsqueeze(-2).size())  #torch.Size([2, 3, 1, 1])
print(a.unsqueeze(-1).size())  #torch.Size([2, 3, 1, 1])
print(a.unsqueeze(0).size())  #torch.Size([1, 2, 3, 1])
print(a.unsqueeze(1).size())  #torch.Size([2, 1, 3, 1])
print(a.unsqueeze(2).size())  #torch.Size([2, 3, 1, 1])
print(a.unsqueeze(3).size())  #torch.Size([2, 3, 1, 1])
print(torch.unsqueeze(a,3))
b=torch.rand(2,1,3,1)
print(b.squeeze().size())    #torch.Size([2, 3])
보충:pytorch 에서 unsqueeze(),squeeze(),expand(),repeat(),view(),cat()함수 의 총 결
Bert 모델 을 배 울 때 는 pytorch 에 사용 하여 tensor 작업 을 해 야 합 니 다.pytorch 와 tensor 에 익숙 하지 않 기 때문에 pytorch 에서 자주 사용 하 는 tensor 작업 에 관 한 unsqueze(),squeeze(),expand(),view(),cat()와 repeat()등 함 수 를 정리 하여 기억 을 깊 게 해 야 합 니 다.
1.unsqueeze()와 squeeze()

torch.unsqueeze(input, dim,out=None) → Tensor
unsqueeze()의 역할 은 주어진 tensor 의 차원 을 증가 시 키 는 데 쓰 인 다.unsqueeze(dim)는 차원 번호 가 dim 인 곳 에서 tensor 에 1 차원 을 증가 시 키 는 것 이다.예 를 들 어 차원 이 torch.size([768])인 tensor 는 어떻게 해야만 torch.size([1,768,1]로 변 할 수 있 습 니까?unsqueeze()를 사용 하여 코드 를 직접 올 릴 수 있 습 니 다.

a=torch.randn(768)
print(a.shape) # torch.Size([768])
a=a.unsqueeze(0)
print(a.shape) #torch.Size([1, 768])
a = a.unsqueeze(2)
print(a.shape) #torch.Size([1, 768, 1])
체인 프로 그래 밍 도 직접 사용 할 수 있 습 니 다.

a=torch.randn(768)
print(a.shape) # torch.Size([768])
a=a.unsqueeze(1).unsqueeze(0)
print(a.shape) #torch.Size([1, 768, 1])
tensor 는 unsqueeze()처 리 를 거 친 후에 총 데 이 터 량 이 변 하지 않 습 니 다.차원 의 확장 은 list 와 유사 합 니 다.

torch.squeeze(input, dim=None, out=None) → Tensor
squeeze()의 역할 은 바로 압축 차원 으로 차원 이 1 인 차원 을 직접 제거 하 는 것 이다.형식적 으로 괄호 를 한 층 빼 는 것 으로 나타난다.
또한 출력 된 장 량 은 원 장 량 과 메모 리 를 공유 하고 그 중 하 나 를 바 꾸 면 다른 하 나 는 달라 집 니 다.

a=torch.randn(2,1,768)
print(a)
print(a.shape) #torch.Size([2, 1, 768])
a=a.squeeze()
print(a)
print(a.shape) #torch.Size([2, 768])

그림 의 차원 정 보 는 다 르 고 빨간색 상자 의 괄호 층수 가 다르다.
주의해 야 할 것 은 squeeze()는 1 차원 만 압축 할 수 있 습 니 다.다른 크기 의 유 지 는 작용 하지 않 는 다.

a=torch.randn(2,768)
print(a.shape) #torch.Size([2, 768])
a=a.squeeze()
print(a.shape) #torch.Size([2, 768])
2、expand()
이 함수 의 역할 은 지정 한 차원 에 대해 수치 크기 를 바 꾸 는 것 이다.차원 크기 를 1 로 바 꿀 수 밖 에 없다.그렇지 않 으 면 잘못 보고 할 것 이다.변 하지 않 는 차원 은-1 또는 원래 의 수 치 를 전달 할 수 있 습 니 다.

torch.Tensor.expand(*sizes) → Tensor
장 량 의 새로운 보 기 를 되 돌려 줍 니 다.장 량 의 단일 차원 을 더 큰 크기 로 확대 할 수 있 습 니 다.

a=torch.randn(1,1,3,768)
print(a) 
print(a.shape) #torch.Size([1, 1, 3, 768])
b=a.expand(2,-1,-1,-1)
print(b)
print(b.shape) #torch.Size([2, 1, 3, 768])
c=a.expand(2,1,3,768)
print(c.shape) #torch.Size([2, 1, 3, 768])
b 와 c 의 차원 이 같은 것 을 볼 수 있 습 니 다.

0 차원 에서 1 에서 2 로 바 뀌 면 원래 의 tensor 를 이 차원 에서 직접 복사 한 것 을 볼 수 있다.
3、repeat()
repeat(*sizes)
지정 한 차원 을 따라 원래 의 tensor 를 데이터 복사 합 니 다.이 함수 와 expand()는 약간의 차이 가 있다.expand()는 차원 이 1 인 차원 만 확대 할 수 있 고 repeat()는 모든 차원 을 마음대로 조작 할 수 있다.

a=torch.randn(2,1,768)
print(a)
print(a.shape) #torch.Size([2, 1, 768])
b=a.repeat(1,2,1)
print(b)
print(b.shape) #torch.Size([2, 2, 768])
c=a.repeat(3,3,3)
print(c)
print(c.shape) #torch.Size([6, 3, 2304])
b 는 a 의 대응 차원 에 곱 하기 1,곱 하기 2,곱 하기 1 의 조작 을 표시 하기 때문에 b:torch.size([2,1,768])
c 는 a 의 대응 차원 에 곱 하기 3,곱 하기 3,곱 하기 3 의 조작 을 표시 하기 때문에 c:torch.size([6,3,2304])
a:

b

c

4、view()
tensor.view()이 함 수 는 reshape 와 유사 한 기능 이 있 습 니 다.간단 한 이 해 는 먼저 tensor 를 1 차원 tensor 로 바 꾼 다음 에 지정 한 차원 의 tensor 로 조합 하 는 것 입 니 다.예 를 들 면:

word_embedding=torch.randn(16,3,768)
print(word_embedding.shape)
new_word_embedding=word_embedding.view(8,6,768)
print(new_word_embedding.shape)
물론 여기 서 지정 한 차원 의 곱 은 반드시 원래 의 tensor 의 차원 곱 과 같 아야 한다.그렇지 않 으 면 잘못 보고 할 것 이다.16*3*768=8*6*768
또한 우리 가 tensor 의 차원 을 바 꿔 야 할 때 관건 적 인 차원 을 알 고 다른 차원 값 을 수 동 으로 계산 하고 싶 지 않 으 면 view(-1)를 사용 하면 pytorch 가 자동 으로 계산 해 줍 니 다.

word_embedding=torch.randn(16,3,768)
print(word_embedding.shape)
new_word_embedding=word_embedding.view(-1)
print(new_word_embedding.shape)
new_word_embedding=word_embedding.view(1,-1)
print(new_word_embedding.shape)
new_word_embedding=word_embedding.view(-1,768)
print(new_word_embedding.shape)
결 과 는 다음 과 같다.-1 을 사용 하면 자동 으로 다른 차원 을 얻 을 수 있다.

특히 주의해 야 할 것 은 view(-1,-1)와 같은 용법 이 잘못 될 수 있다 는 것 이다.즉,view()함수 에 단일-1 만 나타 날 수 있다 는 것 이다.
5、cat()
cat(seq,dim,out=None)는 두 개 이상 의 tensor 를 연결 하 는 것 을 나타 낸다.
그 중에서 seq 는 연결 할 두 개의 서열 을 나타 내 고 원 그룹의 형식 으로 보 여 줍 니 다.예 를 들 어 seq=(a,b),a,b 는 두 개의 연결 할 수 있 는 서열 입 니 다.
dim 은 어느 차원 으로 연결 하 는 지,dim=0,가로 연결 dim=1,세로 연결

a=torch.randn(4,3)
b=torch.randn(4,3)
 
c=torch.cat((a,b),dim=0)#    ,    torch.Size([8, 3])
print(c.shape)
d=torch.cat((a,b),dim=1)#    ,    torch.Size([4, 6])
print(d.shape)
cat(list,dim,out=None),그 중에서 list 의 요 소 는 tensor 입 니 다.

tensors=[]
for i in range(10):
  tensors.append(torch.randn(4,3))
a=torch.cat(tensors,dim=0) #torch.Size([40, 3])
print(a.shape)
b=torch.cat(tensors,dim=1) #torch.Size([4, 30])
print(b.shape)
결과:

torch.Size([40, 3])
torch.Size([4, 30])
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기