텐서의 조작(Manipulations)
인덱싱(Indexing): Numpy처럼 인덱싱 형태로 사용가능
import torch
x = torch.Tensor([[1, 2],
print(x)
print(x[0,0])
print(x[0,1])
print(x[1,0])
print(x[1,1])
print(x[:,0])
print(x[:,1])
print(x[0,:])
print(x[1,:])
[3, 4]]) # 2, 2 Tensor
tensor([[1., 2.],
[3., 4.]])
tensor(1.)
tensor(2.)
tensor(3.)
tensor(4.)
tensor([1., 3.])
tensor([2., 4.])
tensor([1., 2.])
tensor([3., 4.])
view: 텐서의 크기(size)나 모양(shape)을 변경
기본적으로 변경 전과 후에 텐서 안의 원소 개수가 유지되어야 함 -1로 설정되면 계산을 통해 해당 크기값을 유추
x = torch.randn(4, 5)
print(x)
y = x.view(20) # 20개가 flat하게 연달하 있는형태
print(y)
z = x.view(5, -1) # 5로 하나는 지정하되 나머지는 파이토치가 알아서 계산 print(z)
tensor([[-1.8720e+00, -7.2331e-02, 3.7193e-01, 1.0154e+00, -1.0559e-01],
[-1.0061e+00, 1.4172e+00, -7.1989e-01, -1.3614e+00, 1.6795e-01],
[ 1.2220e+00, -3.2777e-01, 5.9258e-01, -1.1359e+00, 6.1076e-01],
[-1.1313e-03, -5.9668e-01, -1.3734e+00, -1.2711e+00, 6.9326e-01]])
tensor([-1.8720e+00, -7.2331e-02, 3.7193e-01, 1.0154e+00, -1.0559e-01,
-1.0061e+00, 1.4172e+00, -7.1989e-01, -1.3614e+00, 1.6795e-01,
1.2220e+00, -3.2777e-01, 5.9258e-01, -1.1359e+00, 6.1076e-01,
-1.1313e-03, -5.9668e-01, -1.3734e+00, -1.2711e+00, 6.9326e-01])
tensor([[-1.8720e+00, -7.2331e-02, 3.7193e-01, 1.0154e+00],
[-1.0559e-01, -1.0061e+00, 1.4172e+00, -7.1989e-01],
[-1.3614e+00, 1.6795e-01, 1.2220e+00, -3.2777e-01],
[ 5.9258e-01, -1.1359e+00, 6.1076e-01, -1.1313e-03],
[-5.9668e-01, -1.3734e+00, -1.2711e+00, 6.9326e-01]])
item: 텐서에 값이 단 하나라도 존재하면 숫자값을 얻을 수 있음
x = torch.randn(1) print(x) print(x.item()) # 실제값 print(x.dtype)
tensor([1.2733])
1.2733298540115356
torch.float32
주의할점: 스칼라값 하나만 존재해야 item()지정 가능
x = torch.randn(2) # 두개의 실수
print(x)
print(x.item()) # 실제값, 실수가 2개 이므로 에러 표시 print(x.dtype)
tensor([0.1241, 0.2529])
--------------------------------------------------------------------------
-
ValueError Traceback (most recent call
last)
<ipython-input-12-db319b104f96> in <module> 1 x = torch.randn(2) # 두개의 실수
2 print(x)
----> 3 print(x.item()) # 실제값 4 print(x.dtype)
ValueError: only one element tensors can be converted to Python scalars
squeeze: 차원을 축소(제거)
tensor = torch.rand(1, 3, 3) # 1 by 3 by 3 tensor
print(tensor)
print(tensor.shape)
tensor([[[0.6159, 0.6669, 0.1964],
[0.0246, 0.9907, 0.2916],
[0.4565, 0.7509, 0.7403]]])
torch.Size([1, 3, 3])
t = tensor.squeeze() # 차원을 제거 print(t)
print(t.shape)
tensor([[0.6159, 0.6669, 0.1964],
[0.0246, 0.9907, 0.2916],
[0.4565, 0.7509, 0.7403]])
torch.Size([3, 3])
unsqueeze: 차원을 증가(생성)
t = torch.rand(3, 3)
print(t)
print(t.shape)
tensor([[0.5200, 0.8666, 0.5006],
[0.8774, 0.9312, 0.0818],
[0.6813, 0.6753, 0.3754]])
torch.Size([3, 3])
tensor = t.unsqueeze(dim=0) # 첫번째 차원을 기준으로 차원을 늘려달라는 의미 print(tensor)
print(tensor.shape)
tensor([[[0.5200, 0.8666, 0.5006],
[0.8774, 0.9312, 0.0818],
[0.6813, 0.6753, 0.3754]]])
torch.Size([1, 3, 3])
tensor = t.unsqueeze(dim=2) # 세번째 차원을 기준으로 차원을 늘려달라는 의미 print(tensor)
print(tensor.shape)
tensor([[[0.5200],
[0.8666],
[0.5006]],
[[0.8774],
[0.9312],
[0.0818]],
[[0.6813],
[0.6753],
[0.3754]]])
torch.Size([3, 3, 1])
stack : 텐서간 결합
x = torch.FloatTensor([1,4])
print(x)
y = torch.FloatTensor([2,5])
print(y)
z = torch.FloatTensor([3,6])
print(z)
print(torch.stack([x, y, z])) # x, y, z 를 쌓으라는 의미 (결합)
tensor([1., 4.])
tensor([2., 5.])
tensor([3., 6.])
tensor([[1., 4.],
[2., 5.],
[3., 6.]])
cat: 텐서를 결합하는 메소드 (concatenate) 넘파이의 stack과 유사하지만, 쌓을 dim이 존재해야함 해당 차원을 늘려준 후 결함
a = torch.randn(1, 3, 3)
print(a)
b = torch.randn(1, 3, 3)
print(b)
c = torch.cat((a, b), dim=0) # a와 b를 첫번째 차원 기준으로 결합 print(c)
print(c.size())
tensor([[[-0.0921, 0.8446, 1.1412],
[ 1.4921, 0.3963, -0.0886],
[-0.1311, 0.3033, 0.5750]]])
tensor([[[ 0.2598, 0.6969, -1.0889],
[ 0.6247, 0.1838, 0.3120],
[-0.6176, -0.2345, 0.0726]]])
tensor([[[-0.0921, 0.8446, 1.1412],
[ 1.4921, 0.3963, -0.0886],
[-0.1311, 0.3033, 0.5750]],
[[ 0.2598, 0.6969, -1.0889],
[ 0.6247, 0.1838, 0.3120],
[-0.6176, -0.2345, 0.0726]]])
torch.Size([2, 3, 3])
c = torch.cat((a, b), dim=1) # a와 b를 두번째 차원 기준으로 결합 print(c)
print(c.size())
tensor([[[-0.0921, 0.8446, 1.1412],
[ 1.4921, 0.3963, -0.0886],
[-0.1311, 0.3033, 0.5750],
[ 0.2598, 0.6969, -1.0889],
[ 0.6247, 0.1838, 0.3120],
[-0.6176, -0.2345, 0.0726]]])
torch.Size([1, 6, 3])
chunk: 텐서를 여러 개로 나눌 때 사용 (몇개로 나눌 것인가?) tensor = torch.rand(3,6)
print(tensor)
t1, t2, t3 = torch.chunk(tensor, 3, dim=1) #3 by 6으로 만든 텐서를 t1, t2, t3 세대로print(t1)
print(t2)
print(t3)
tensor([[0.0162, 0.2048, 0.8050, 0.3001, 0.6238, 0.5606],
[0.7817, 0.5015, 0.6936, 0.5458, 0.3566, 0.3038],
[0.0692, 0.1783, 0.8850, 0.2821, 0.4308, 0.9963]])
tensor([[0.0162, 0.2048],
[0.7817, 0.5015],
[0.0692, 0.1783]])
tensor([[0.8050, 0.3001],
[0.6936, 0.5458],
[0.8850, 0.2821]])
tensor([[0.6238, 0.5606],
[0.3566, 0.3038],
[0.4308, 0.9963]])
split: chunk와 동일한 기능이지만 조금 다름(텐서의 크기는 몇인가) 기능상으로는 나누는 것은 동일하나 나누는 방식의 차이가 있다. chunk는 나누고자 하는 갯수 / split은 나누는 기존 텐서의 차원 크기
tensor = torch.rand(3, 6)
t1, t2 = torch.split(tensor, 3, dim=1) # 기존 텐서의 크기를 지정
print(tensor)
print(t1)
print(t2)
print(t2)
tensor([[0.6689, 0.1454, 0.8723, 0.1533, 0.0454, 0.2029],
[0.2343, 0.0671, 0.9357, 0.0074, 0.7333, 0.0529],
[0.0767, 0.8364, 0.2677, 0.0702, 0.0421, 0.1078]])
tensor([[0.6689, 0.1454, 0.8723],
[0.2343, 0.0671, 0.9357],
[0.0767, 0.8364, 0.2677]])
tensor([[0.1533, 0.0454, 0.2029],
[0.0074, 0.7333, 0.0529],
[0.0702, 0.0421, 0.1078]])
'IT > 머신러닝공부' 카테고리의 다른 글
PyTorch - 데이터준비, Dataset Colab (0) | 2023.01.04 |
---|---|
PyTorch - numpy를 활용하기 간단 정리 Colab (0) | 2023.01.04 |
PyTorch 간단 소개 Colab 사용 (0) | 2023.01.04 |
AI Snake Game - Reinforcement Learning with PyTorch[1] by Patrick Loeber (2) | 2023.01.02 |
Kaggle Surface Crack Detection data Example script (0) | 2022.12.31 |