Tensor Manipulation 1

PyTorch Manipulation I


Import

In [1]:
import numpy as np
import torch



Numpy


1D Array with NumPy

In [2]:
t=np.array([0.,1.,2.,3.,4.,5.,6.])
t
Out[2]:
array([0., 1., 2., 3., 4., 5., 6.])
In [3]:
# array차원
print('Rank of t:',t.ndim)

# array모양
print('Shape of t:',t.shape)
Rank of t: 1
Shape of t: (7,)
In [4]:
# 원소 인덱싱
print('t[0] t[1] t[-1] = ',t[0],t[1],t[-1])
# 원소 슬라이싱
print('t[2:5] t[4:-1] = ',t[2:5],t[4:-1])
print('t[:2] t[3:] = ',t[2:],t[3:])
t[0] t[1] t[-1] =  0.0 1.0 6.0
t[2:5] t[4:-1] =  [2. 3. 4.] [4. 5.]
t[:2] t[3:] =  [2. 3. 4. 5. 6.] [3. 4. 5. 6.]

2D Array with NumPy

In [5]:
t=np.array([[1.,2.,3.],[4.,5.,6.],[7.,8.,9.],[10.,11.,12.]])
print(t)
[[ 1.  2.  3.]
 [ 4.  5.  6.]
 [ 7.  8.  9.]
 [10. 11. 12.]]
In [6]:
print('Rank of t: ', t.ndim)
print('Shape of t: ',t.shape)
Rank of t:  2
Shape of t:  (4, 3)



PyTorch Tensor


1D Array with PyTorch

In [7]:
t=torch.FloatTensor([0.,1.,2.,3.,4.,5.,6.])
print(t)
tensor([0., 1., 2., 3., 4., 5., 6.])
In [8]:
# 차원
print(t.dim())
# 모양
print(t.shape)
print(t.size())
print(t[0],t[1],t[-1])
print(t[2:5],t[4:-1])
print(t[:2],t[3:])
1
torch.Size([7])
torch.Size([7])
tensor(0.) tensor(1.) tensor(6.)
tensor([2., 3., 4.]) tensor([4., 5.])
tensor([0., 1.]) tensor([3., 4., 5., 6.])

2D Array with PyTorch

In [9]:
t=torch.FloatTensor([[1.,2.,3.],[4.,5.,6.],[7.,8.,9.],[10.,11.,12.]])
print(t)
tensor([[ 1.,  2.,  3.],
        [ 4.,  5.,  6.],
        [ 7.,  8.,  9.],
        [10., 11., 12.]])
In [10]:
# 차원
print(t.dim())
# 모양
print(t.size())
print(t[:,1])
print(t[:,1].size())
print(t[:,:-1])
2
torch.Size([4, 3])
tensor([ 2.,  5.,  8., 11.])
torch.Size([4])
tensor([[ 1.,  2.],
        [ 4.,  5.],
        [ 7.,  8.],
        [10., 11.]])



Broadcasting


In [11]:
# Same shape
m1=torch.FloatTensor([3,3])
m2=torch.FloatTensor([2,2])
print(m1+m2)
tensor([5., 5.])
In [12]:
# Vector + Scalar
m1=torch.FloatTensor([1,2])
m2=torch.FloatTensor([3])
print(m1+m2)
tensor([4., 5.])
In [13]:
# 2x1 Vector + 1x2 Vector
m1=torch.FloatTensor([[1,2]])
m2=torch.FloatTensor([[3],[4]])
print(m1+m2)
tensor([[4., 5.],
        [5., 6.]])
  • 모양이 맞지 않아도 에러가 발생하지 않기때문에 Broadcsting을 사용할 때는 주의가 필요하다.



Multiplication vs Matrix Multiplication


In [14]:
print()
print('-'*15)
print('Mul vs Matmul')
print('-'*15)
# Matmul
m1=torch.FloatTensor([[1,2],[3,4]])
m2=torch.FloatTensor([[1],[2]])
print('Shape of Matrix 1: ',m1.shape) # 2 x 2
print('Shape of Matrix 2: ',m2.shape) # 2 x 1
print(m1.matmul(m2)) # 2 x 1

# Mul
m1=torch.FloatTensor([[1,2],[3,4]])
m2=torch.FloatTensor([[1],[2]])
print('Shape of Matrix 1: ',m1.shape) # 2 x 2
print('Shape of Matrix 2: ',m2.shape) # 2 x 1
print(m1*m2)
print(m1.mul(m2)) # 2 x 2
---------------
Mul vs Matmul
---------------
Shape of Matrix 1:  torch.Size([2, 2])
Shape of Matrix 2:  torch.Size([2, 1])
tensor([[ 5.],
        [11.]])
Shape of Matrix 1:  torch.Size([2, 2])
Shape of Matrix 2:  torch.Size([2, 1])
tensor([[1., 2.],
        [6., 8.]])
tensor([[1., 2.],
        [6., 8.]])



Mean


In [15]:
t=torch.FloatTensor([1,2])
print(t.mean())
tensor(1.5000)
In [16]:
# Can't use mean() on integers
t= torch.LongTensor([1,2])
try:
    print(t.mean())
except Exception as exc:
    print(exc)
Can only calculate the mean of floating types. Got Long instead.

t.mean을 사용하게 되면 모든 요소들에 대한 평균을 구한다.
dim인자를 정해주면 해당 차원의 원소들의 평균을 구해 준다.

In [17]:
t= torch.FloatTensor([[1,2],[3,4]])
print(t)
tensor([[1., 2.],
        [3., 4.]])
In [18]:
print(t.mean())
print(t.mean(dim=0))
print(t.mean(dim=1))
print(t.mean(dim=-1))
tensor(2.5000)
tensor([2., 3.])
tensor([1.5000, 3.5000])
tensor([1.5000, 3.5000])
  • dim은 해당 차원을 제거한다는 의미가 됩니다.
  • 0은 첫번째 차원으로 '행'을 의미하고, 1은 두번째 차원으로 '열'을 의미합닏.



Sum


In [19]:
t= torch.FloatTensor([[1,2],[3,4]])
print(t)
tensor([[1., 2.],
        [3., 4.]])
In [20]:
print(t.sum())
print(t.sum(dim=0))
print(t.sum(dim=1))
print(t.sum(dim=-1))
tensor(10.)
tensor([4., 6.])
tensor([3., 7.])
tensor([3., 7.])



Max and Argmax


In [21]:
t= torch.FloatTensor([[1,4],[2,3]])
print(t)
tensor([[1., 4.],
        [2., 3.]])

max에 인자가 없다면 모든 원소중에서 가장 큰 값을 반환합니다.

In [22]:
print(t.max())
tensor(4.)

max연산자는 2개의 값을 반환한다. 첫번째 값은 최댓값, 두번째 값은 최댓값을 가지는 원소의 인덱스를 반환한다.

In [23]:
print(t.max(dim=0))
print('Max: ',t.max(dim=0)[0])
print('Argmax: ',t.max(dim=0)[1])
torch.return_types.max(
values=tensor([2., 4.]),
indices=tensor([1, 0]))
Max:  tensor([2., 4.])
Argmax:  tensor([1, 0])
In [24]:
print(t.max(dim=1))
print(t.max(dim=-1))
torch.return_types.max(
values=tensor([4., 3.]),
indices=tensor([1, 1]))
torch.return_types.max(
values=tensor([4., 3.]),
indices=tensor([1, 1]))

'AI > 파이토치로 시작하는 딥러닝 기초' 카테고리의 다른 글

도커환경설정  (0) 2021.01.18

+ Recent posts