20210727 TIL

pytorch broadcasting

  1. 각 tensor는 최소 1개 이상의 dimension을 갖고 있어야한다.
  2. dimension size를 iterate 할때에 dimension의 size가 같거나 둘 중 하나는 1 혹은 없어야 한다.

(3, 2, 4)와 (1, 4)는 broadcastable 하다.

3 - 2 - 4 0 - 1 - 4

뒤에서 부터 확인하면 되는데, 4와 4 동일(오케이), 2와 1 둘 중 하나는 없거나 1(오케이), 3과 없음은 둘 중 하나는 없거나 1 (오케이)

(3, 1, 2)와 (1,3)은 non-broadcastable하다.

3 - 1 - 2 0 - 1- 3

뒤에서부터 확인. 2와 3 : 같거나(노노) 둘 중 하나는 1 혹은 없음 (노노) = 브로드캐스팅 안된다.

print(x.unsqueeze(2))
print(x.unsqueeze(2).size())
print(x.unsqueeze(1))
print(x.unsqueeze(1).size())
# print(x.unsqueeze(3))
# print(x.unsqueeze(3).size())
# 3을 넣으면 에러남
# 그러면 unsqueeze(2) 하고 나서 3을 넣으면 에러날까?
print(x.unsqueeze(2).unsqueeze(3))
print(x.unsqueeze(2).unsqueeze(3).size())
# 오,, 에러는 안나고 맨 마지막 차원이 추가가 됐넹
print(x.unsqueeze(-1))
print(x.unsqueeze(-1).size())
print(x.reshape(2, 2, -1))
print(x.reshape(2, 2, -1).size())

차원을 늘리기 어떤 차원을 늘려줄지는 반드시 명시를 해줘야함.

줄이기(sum, mean)

# dim을 명시 == 없어질 차원을 명시
print(x.sum(dim=0)) # y 축(첫번째 차원)에 대해서 차원 축소
print(x.sum(dim=-1)) # x 축(맨 마지막 차원)에 대해서 축소

dim을 명시해서 축소, (2, 2)였다면 각각 (1,2) (2,1)으로 축소 된다고 생각하고 계산하면 됨.

직접 계산하는 것이 아니지만 어느 방향으로 계산될지를 생각할 수 있어야함.

view와 reshape은 같은 기능을 하지만 미묘하게 다름. view가 조금 더 low-level에서 동작한다는 것.

contiguous + view = reshape

댓글을 작성해보세요.

채널톡 아이콘