본문 바로가기

머신러닝공부

PyTorch - 텐서의 조작(Manipulating the Tensor) 간단 정리 Colab

728x90
반응형

텐서의 조작(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]])
반응형