numpy와 비슷하다.
동일한건줄 알았는데 다르다고 한다.
https://sanghyu.tistory.com/3
많이 사용했던 함수인데 제대로된 정의를 몰랐었다.
이전 포스팅에서도 정리했던 내용이다.
https://pytorch.org/docs/stable/generated/torch.index_select.html
이해가 어려웠는데 python의 list나 numpy에서 slicing하는 것을 tensor 단위로 한다고 생각하면 편하다.
torch.index_select(input, dim, index, *, out=None) → Tensor
input: 검색 대상이다.
dim: axis, index의 기준을 설정한다.
index: tensor를 입력으로 한다. 어떤 것을 찾을지 결정한다.
>>> x = torch.randn(3, 4)
>>> x
tensor([[ 0.1427, 0.0231, -0.5414, -1.0009],
[-0.4664, 0.2647, -0.1228, -1.1068],
[-1.1734, -0.6571, 0.7230, -0.6004]])
>>> indices = torch.tensor([0, 2])
>>> torch.index_select(x, 0, indices)
tensor([[ 0.1427, 0.0231, -0.5414, -1.0009],
[-1.1734, -0.6571, 0.7230, -0.6004]])
>>> torch.index_select(x, 1, indices)
tensor([[ 0.1427, -0.5414],
[-0.4664, -0.1228],
[-1.1734, 0.7230]])
가령 torch.index_select(x, 0, indices)는 x tensor에서 0차원을 기준으로 indices에 해당하는 것들을 찾고자 하는 것이다. 즉, 0번째 차원의 0번째, 2번째 요소들을 반환한다.
numpy랑 같다
두 함수 모두 tensor를 객체로 구현하기 위한 함수이다. 다만 차이점이 있다.
https://pytorch.org/docs/stable/generated/torch.gather.html#torch.gather
torch.gather(input, dim, index, *, sparse_grad=False, out=None) → Tensor
dim 차원 관점에서 input을 index만큼 slicing해준다. 사용하라면 사용 가능한데 남들처럼 깔끔하게 사용을 못하겠다.https://data-newbie.tistory.com/709
나는 input과 동일한 tensor를 생성하고 해당 tensor에서 원하는 값의 위치를 적어주는 식으로 사용하고 있다.
A = torch.Tensor([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
indicies = torch.tensor([[[0],
[1]],
[[0],
[1]]])
output = torch.gather(A, 2, indicies).squeeze()
내가 아는 그 mlp의 한 layer이다. 이걸 아래처럼 사용하기도 하더라.
X = torch.Tensor([[1, 2],
[3, 4]])
forward = nn.Linear(2, 5)
forward(X).shape
당연한거긴한데, 쉽게 생각이 안났다..
말 그대로 입력과 동일한 tensor를 출력으로 내보내주는 layer다.
https://pytorch.org/docs/stable/generated/torch.nn.LazyLinear.html#torch.nn.LazyLinear
내가 이해한게 맞다면
첫번째 forward에서는 torch.nn.UninitializedParameter에서 weight와 bias를 가져와서 연산한다.
피어세션 때 알게 된 내용
state_dict로 모델을 저장할 때, 보통 네트워크의 w, bias들과 같은 parameter들만 저장된다.
가령, parameter외의 tensor를 저장하고 싶을 때는 register_buffer를 쓰면 된다. BN의 tensor를 어떻게 사용할건지 등, 사용할 곳이 있다고는 하더라.