Skip to main content

Command Palette

Search for a command to run...

Torch.unsqueeze and squeeze

Updated
2 min read

torch.unsqueezetorch.squeeze 는 가끔 헷갈리는 개념이다. 머리로는 이해하는 것 같지만 막상 쓰려고 할때 팍 이해가 안가는 느낌이 많이 든다. 그래서 오늘 조금 정리해보려고 한다.

Tensor 와 차원(Dimension)

Pytorch 에서 Tensor 는 숫자값을 담는 다차원 배열이라고 생각하면 편하다. N 차원 텐서들을 아래와 같은 형태로 정의할 수 있다.

zero_dim = torch.tensor(5)
one_dim = torch.tensor([1, 2, 3])
two_dim = torch.tensor([[1,2], [3,4]])

위와 같은 방법으로 N 차원을 정의 가능하고, Tensor 의 각차원에 몇개의 원소가 있는지 확인해보기 위해서는 shape 라는 속성을 확인해보면 된다.

  • zero_dim.shape => torch.Size([])

  • one_dim.shape => torch.Size([3])

  • two_dim.shape => torch.Size([2, 2])

    • 우리가 만든 이차원 텐서 two_dim 기준으로 설명해보면 첫번째 차원(축 0) 에는 2개의 원소가 있고, 두번째 차원(축 1) 에도 2개의 원소가 있음을 뜻한다.

Unsqueeze

unsqueeze 는 이름만 봐도 살짝 유추가능하듯이 텐서에 크기가 1인 새로운 차원을 추가하는 함수이다. dim 이라는 parameter 를 추가적으로 넣을 수 있는데, 어떤 인덱스에 크기가 1인 새로운 차원을 넣을지 우리가 정할 수 있는 인덱스 이다.

>>> x = torch.tensor([1, 2, 3, 4])
>>> x.shape
torch.Size([4])

>>> u_t = torch.unsqueeze(x, 0)
>>> u_t
tensor([[ 1,  2,  3,  4]])

>>> u_t.shape
>>> torch.Size([1, 4])

위의 예시를 보면 가장 바깥쪽(축 0) 에 차원을 추가하게 되면 1개의 행과 4개의 열을 가진 이차원 텐서로 변하는 것을 확인할 수 있다. 즉, 원래는 4개의 열을 가진 텐서에서 하나의 행과 4개의 열을 가진 텐서로 unsqueeze 되었다.

일차원으로만 하면 이해가 어렴풋이 잘 안갈수도 있으니 이차원으로 다시 시도해보자.

>>> y = torch.tensor([[1, 2], [3, 4]])
>>> y.shape
torch.Size([2, 2])

>>> y_unsqueezed_0 = y.unsqueeze(dim=0)
>>> y_unsqueezed_0.shape
torch.Size([1, 2, 2])

>>> y_unsqueezed_1 = y.unsqueeze(dim=1)
>>> y_unsqueezed_1.shape
torch.Size([2, 1, 2])

>>> y_unsqueezed_2 = y.unsqueeze(dim=2)
>>> y_unsqueezed_2.shape
torch.Size([2, 2, 1])

위의 예시를 보면 어느 차원에 차원을 추가하게 될지에 따라서 shape 속성이 변하는 것을 확인할 수 있다. 0 차원에 추가했을때는 [[[1, 2], [3, 4]]] 가 될테고, 1 차원에 추가했을때는 [[[1,2]], [[3,4]]] 와 같은 형태가 되고, 2차원에 추가했을때에는 [[[1], [2]], [[3],[4]]] 와 같이 된다.

when to use?

언제 사용하는지는 대부분 알수도 있지만, 보통 우리가 만든 텐서를 배치처리를 하는 모델의 입력값으로 넣어야 할때 입력값으로 [배치크기, 채널, 높이, 너비] 와 같이 보통 제일 바깥쪽에 N(배치 차원)을 추가해야 하므로, t.unsqueeze(0) 을 하는 경우가 많다.

Squeeze

그렇다면 torch.squeeze 는 무엇일까? squeeze 는 차원을 줄이는 역할을 한다. squeeze 역시도 dim 이라는 파라미터를 가지고 있는데 해당 차원을 줄이는 역할을 한다. 하지만 공식문서에 적힌 설명을 보면 크기가 1인 차원에 대해서만 차원을 줄인다고 한다. 공식문서에 적힌 예를 보면 (A×1×B) 차원의 텐서에 squeeze(input, 0) 을 하면 텐서가 변하지 않고, squeeze(input, 1) 를 하는 경우에는 크기가 1인 차원이 없어져 (A×B) 차원의 텐서로 변한다고 한다.

사실 여기는 unsqueeze 를 이해했다면 이해가 잘될거라고 생각하고 별 다르게 더 짚고 넘어가지는 않겠다.

More from this blog

RDB 에서 큰 컬럼을 인덱스로 잡으면 안되는 이유

B-Tree 는 기본적으로 페이지 사이즈 와 저장할 수 있는 원소의 개수를 고정값으로 사용한다. 하지만 우리가 실제로 페이지에 저장하는 값은 가변적인 크기를 가지고 있기 때문에 필연적으로 물리적으로 저장해야할 개수가 다 차기도 전에 페이지가 넘치는 상황에 부딪히게 된다. 예를 들어 100KB 를 저장하는 페이지에 위와 같이 데이터를 저장한 상태이다. 여

Feb 26, 20262 min read49

Slotted Page

데이터베이스와 관련된 기술을 보다보면 어떻게 데이터를 관리하고 저장하지? 특히 단편화(Fragmentation) 이 일어나는 것을 어떻게 통제하고 관리할까? 혹은 정렬된 자료구조 내부에서 데이터의 순서를 보존하기 위해 어떠한 행위들을 할까? 궁금해집니다. 오늘은 조금 더 데이터베이스 내부에 쓰이는 자료구조를 들여다보며 연관된 행위를 공부해보려고 합니다. F

Feb 22, 20264 min read63
Slotted Page

MCP 를 통한 workflow 자동화

AI native 최근에 LinkedIn 이나 여러 소셜 플랫폼들의 글을 보면 AI native 회사 라는 워딩들이 많이 보입니다. IBM 의 정의에 따르면 AI native 를 아래와 같이 정의한다고 하는데요. “AI를 사고와 업무 방식에 끊임없이 내재화하는 상태” 그렇다면 팀원들이 계속해서 AI 를 사고와 업무 방식에 끊임 없이 내재화 하려면 어떻게 해야할까요? 개발자들은 이미 Claude code 나 Codex 등 여러 AI Tool...

Feb 14, 20263 min read100

파이썬 톺아보기 2화 - Ast 와 바이트코드

식(Expression) 과 문장(Statement) 프로그래밍을 공부하다보면 위 두 단어를 반드시 마주하게 된다. 가끔 헷갈려하는 경우가 많은데 오늘은 python 에서 기본 모듈인 ast 모듈을 공부하며 이를 알아보도록 하자. 식(Expression) 기본적으로 식(Expression) 이란 평가되면 값이 나오는 코드 조각을 뜻한다. 파이썬에서는 어떠한 부분들이 있을까? 노드 타입설명예시 BinOp이항 연산a + b, x * y...

Feb 6, 20267 min read30
D

dev_roach

41 posts