일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- API
- 기초
- PyTorch
- 알고리즘
- 재귀함수
- 선형회귀
- 게임
- 파이썬
- DeepLearning
- 가격맞히기
- python
- 흐름도
- 프로그래머스
- tensorflow
- 주식
- 추천시스템
- 크롤링
- 머신러닝
- 주식연습
- 연습
- 주가예측
- 코딩
- 코딩테스트
- 회귀
- CLI
- Regression
- 템플릿
- 주식매매
- Linear
- 딥러닝
- Today
- Total
코딩걸음마
[딥러닝] Pytorch 주요함수 expand/randperm/argmax/topk/masked_fill/Ones , Zeros 본문
[딥러닝] Pytorch 주요함수 expand/randperm/argmax/topk/masked_fill/Ones , Zeros
코딩걸음마 2022. 6. 24. 19:07
1. expand
expand는 Tensor를 복사하여 원하는 차원으로 만드는 방법이다.
import torch
x = torch.FloatTensor([[[1, 2]],
[[3, 4]]])
print(x.size())
torch.Size([2, 1, 2])
이 tensor를 복사하여 [2, 4, 2] 형태로 바꿔보자
y = x.expand(*[2, 4, 2])
print(y)
print(y.size())
tensor([[[1., 2.],
[1., 2.],
[1., 2.],
[1., 2.]],
[[3., 4.],
[3., 4.],
[3., 4.],
[3., 4.]]])
torch.Size([2, 4, 2])
물론 cat을 활용해서 붙힐 수 있다.
y = torch.cat([x, x, x, x], dim=1)
print(y)
print(y.size())
tensor([[[1., 2.],
[1., 2.],
[1., 2.],
[1., 2.]],
[[3., 4.],
[3., 4.],
[3., 4.],
[3., 4.]]])
torch.Size([2, 4, 2])
2. randperm
무작위 정수로 이루어진 수열을 가진 tensor를 생성하는 함수이다.
index_select 함수와 같이 활용하여 무작위추출, 셔플링을 하는데 활용할 수 있다
randperm(n) n안에 정수를 넣어서 사용한다. list나 다른 형태는 불가능
.
x = torch.randperm(15)
x
tensor([12, 14, 7, 8, 5, 9, 2, 10, 1, 3, 0, 4, 6, 13, 11])
3. argmax
argmax는 딥러닝 과정에서 자주 쓰이는 함수이다.
tensor 내 data 중 가장 높은 값을 가지는 index를 반환한다.
그러면 예시를 위해 randperm 함수를 활용하여 tensor를 선언해보자.
x = torch.randperm(2**3).reshape(2, 2, -1)
print(x)
print(x.size())
tensor([[[0, 7],
[5, 1]],
[[2, 6],
[3, 4]]])
torch.Size([2, 2, 2])
argmax(dim=-1)은 마지막 차원 즉, 3차원에서 바라보았을 때(3차원의 경우 바라보는 기준은 끝값을 기준으로 바라본다)를 기준으로 최대값의 인덱스를 반환한다.
y = x.argmax(dim=-1)
print(y)
print(y.size())
tensor([[1, 0],
[1, 1]])
torch.Size([2, 2])
처음 인덱스를 보면 당황스럽기 그지없다. 인덱스 값으로 나온값이 직관적으로 해석되지않기 때문이다.
argmax가 반환한 인덱스 [[1, 0], [1, 1]] 은 바라보는 면(인덱스자체가 2x2) 기준으로 0번째인지 1번째인지 말해주는 뜻이다.
물론 말을 풀어써도 어렵다. 아래의 그림을 보자.
4. topk
x = torch.LongTensor([[[0, 7],
[5, 1]],
[[2, 6],
[3, 4]]])
values, indices = torch.topk(x, k=1, dim=0)
print(values.size())
print(indices.size())
topk는 파라미터로 tensor, k, dim을 받는
k는 몇 등까지 data를 가져올건지 정하는 파라미터이고,
dim은 몇차원을 기준으로 할것인지 정하는 파라미터이다.
그 후, argmax처럼 index를 반환할 뿐만 아니라, values까지 출력한다.
indices
tensor([[[1, 0],
[0, 1]]])
values
tensor([[[2, 7],
[5, 4]]])
물론 argmax처럼 직관적인 해석이 불가능하다.
그림을 보고 이해해보자.
+ 정렬 sort (topk를 활용하여 구현해보자)
target_dim = 0
values, indices = torch.topk(x,
k=x.size(target_dim),
largest=True)
print(values)
tensor([[[7, 0],
[5, 1]],
[[6, 2],
[4, 3]]])
5. masked_fill
pandas에서 특정조건을 가진 mask를 만들어 DataFrame에 대입하여 bool 형태의 값을 반환하는
mask가 있다. pytorch에도 이러는 mask기법이 있는데 이를 알아보자.
우선 간단한 FloatTensor를 만들어 보자.
x = torch.FloatTensor([i for i in range(3**2)]).reshape(3, -1)
print(x)
print(x.size())
tensor([[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]])
torch.Size([3, 3])
mask 는 tensor에 조건을 준 값을 변수로 받는다.
mask = x > 4
print(mask)
tensor([[False, False, False],
[False, False, True],
[ True, True, True]])
mask를 출력해보면 bool 형태의 dype을 가진 것을 확인할 수 있다.
그렇다면 이 mask를 통해 data를 추출해보자
y = x.masked_fill(mask, value=-1)
print(y)
masked_fill(mask, value=-1)
mask에서 Ture인 위치의 값들은 value에 입력된 -1이 입력된다.
tensor([[ 0., 1., 2.],
[ 3., 4., -1.],
[-1., -1., -1.]])
6. Ones , Zeros
numpy에도 비슷한 기능이 있다. 특정한 크기를 가졌지만 빈 array가 아닌 array를 만들때 사용한다.
방법은 numpy와 매우 유사한 방법이다. (np.zeros)
print(torch.ones(2, 3))
print(torch.zeros(2, 3))
tensor([[1., 1., 1.],
[1., 1., 1.]])
tensor([[0., 0., 0.],
[0., 0., 0.]])
딥러닝 연산을 수행 할때 data들은 dtype과 사용하는 device(gpu or cpu)가 모두 같아야한다. 이때 앞서 사용된 dtype과 device를 계승하는 방식으로 값을 생성하는 방법은 아래와 같다.
print(torch.ones_like(x))
print(torch.zeros_like(x))
tensor([[1., 1., 1.],
[1., 1., 1.]])
tensor([[0., 0., 0.],
[0., 0., 0.]])
'딥러닝_Pytorch' 카테고리의 다른 글
[딥러닝] Pytorch 선형결합층(Linear_layer) (0) | 2022.06.26 |
---|---|
[딥러닝] Pytorch 행렬/텐서의 곱셈(Matrix/tensor Multiplication) (0) | 2022.06.24 |
[딥러닝] Pytorch 슬라이싱/합치기(concat),stack/split,chunk/ index_select (0) | 2022.06.23 |
[딥러닝] Pytorch 차원다루기(Shaping/squeeze) (0) | 2022.06.23 |
[딥러닝] Pytorch 기초연산 (0) | 2022.06.23 |