20210727 TIL
2021.07.27
pytorch broadcasting
- 각 tensor는 최소 1개 이상의 dimension을 갖고 있어야한다.
- 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
댓글을 작성해보세요.