본문 바로가기
IT 도서/Pytorch로 시작하는 딥 러닝 입문

01. 파이토치 기초 (Pytorch Basic)

by 이민우 2021. 3. 1.
728x90
반응형

wikidocs.net/book/2788

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

*해당 글은 학습을 목적으로 위의 포스팅 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.

 상세한 내용 및 전체 내용 확인을 원하신다면 도서 구매를 추천드립니다.

 

 

파이토치 패키지 기본 구성

torch 메인 네임 스페이스. 텐서 등의 수학 함수가 포함됐으며, Numpy와 유사한 구조를 가진다.
torch.autograd 자동 미분을 위한 함수 포함
torch.nn 신경망을 구축하기 위한 다양한 데이터 구조나 레이어 정의
torch.optim 확률적 경사 하강법을 중심으로 한 최적화 알고리즘 구현
torch.utils.data SGD의 반복 연산 실행 시 사용하는 미니 배치용 유틸리티 함수
torch.onnx ONNX 포멧으로 모델을 export하여 딥 러닝 프레임워크 간 모델을 공유

자주 사용할 패키지

torch 메인 네임 스페이스. 텐서 객체 사용을 위해 선언
torch.nn 모듈, 레이어 사용을 위해 선언
torch.nn.functional 비용 함수
torch.utils.data.DataLoader 미니 배치로 나눌 수 있는 데이터로더를 만들기 위함.
torch.utils.data.TensorDataset 데이터셋을 만들기 위함

 

 


 

텐서 조작하기

 

  • 1D 텐서 : [1 2 3]
  • 2D 텐서 : [[1 2 3] [4 5 6]]
  • 3D 텐서 : [[[1 2 3] [4 5 6]] [[7 8 9] [10 11 12]]]
  • 4D 텐서 : 3D 텐서를 위로 확장
  • 5D 텐서 : 4D 텐서를 옆으로 확장
  • 6D 텐서 : 5D 텐서를 뒤로 확장

 

 

import torch


#선언
a = torch.ones(2,2)
a = torch.zeros(2,2)
a = torch.randint(0, 10, (2,2)) #0~10 까지 2*2 배열

a = torch.ones_like(a) #a의 크기에 맞추기
#zeros_like도 가능.

t1D = torch.FloatTensor([0, 1, 2, 3, 4]) 
print(t1D) # tensor([0., 1., 2., 3., 4.])
t2D = torch.FloatTensor([[0, 1], [2, 3]])
print(t2D) #tensor([[0., 1.], [2., 3.]])


#정보 확인
print( t2D.dim() ) # 2
print( t2D.shape ) # torch.Size([2, 2])
print( t2D.size() )# torch.Size([2, 2]) shape과 같음.


#슬라이싱
#Numpy에서 사용하는 왠만한 거 사용 가능.
print( t2D[:, :-1] ) #tensor([[0.], [2.]])
print( t2D[0] )      #tensor([0., 1.])


#브로드 캐스팅
#덧셈, 뺄셈 시에는 두 행렬의 크기가 같아야 한다.
#곱셈 시에는 앞 행렬의 마지막 차원과 뒤 행렬의 첫 차원이 같아야 한다.
#하지만 파이토치는 자동으로 크기를 맞춰 크기가 다른 연산도 가능하게 하는데, 이를 브로드 캐스팅이라 한다.
a = torch.FloatTensor([[1, 2]])
b = torch.FloatTensor([3]) #[3] -> [3, 3]
print(a + b) #tensor([[4., 5.]])


#행렬 곱셈
a = torch.FloatTensor([[1,2], [3,4]])
b = torch.FloatTensor([[1], [2]])
'''
1 2   1   5
3 4 * 2 = 1
'''
print( a.matmul(b) ) #tensor([[ 5.], [11.]])

#그냥 곱셈 (element-wise 곱셈)
'''
동일한 크기의 행렬이 동일한 위치에 있는 원소끼리 곱 (브로드 캐스팅)
1 2   1 1   1 2
3 4 * 2 2 = 6 8
'''
print( a*b )
print( a.mul(b) )
# mul 말고 mul_ 사용시 기존 배열에 덮어씌워짐.


#평균
print( a.mean() ) #tensor(2.5000)
print( a.mean(dim = 0) ) #tensor([2., 3.]) 열별 평균
print( a.mean(dim = 1) ) #tensor([1.5, 3.5]) 행별 평균


#덧셈
print( a.sum() )         #tensor(10.)
print( a.sum(dim = 0) )  #tensor([4., 6.]) 열별
print( a.sum(dim = 1) )  #tensor([3., 7.]) 행별
print( a.sum(dim = -1) ) #tensor([3., 7.]) 행별


#최댓값, 최댓값 위치
print( a.max() )         #tensor(4.)
print( a.max(dim = 0) )  #torch.return_types.max(values=tensor([3., 4.]), indices=tensor([1, 1]))
print( a.max(dim = 1) )  #torch.return_types.max(values=tensor([2., 4.]),indices=tensor([1, 1]))
print( a.max(dim = -1) ) #torch.return_types.max(values=tensor([2., 4.]),indices=tensor([1, 1]))

print( a.argmax() )         #tensor(3)
print( a.argmax(dim = 0) )  #tensor([1, 1])
print( a.argmax(dim = 1) )  #tensor([1, 1])
print( a.argmax(dim = -1) ) #tensor([1, 1])


#텐서의 크기 변경
#view : 원소의 수를 유지하며 텐서의 크기 변경 *매우 중요
a = torch.FloatTensor(
             [[[0, 1, 2],
               [3, 4, 5]],
              [[6, 7, 8],
               [9, 10, 11]]]
) #2*2*3 텐서
#2차원으로 변경
print( a.view([-1, 3]) ) # (?, 3) 으로 변경
'''
-1으로 지정시 다른 파라미터에 맞춰 자동으로 수정
지금 2*2*3 => ?*3이 되어야 해서 ?는 자동으로 4.
그래서 4*3 텐서로 바뀜.
tensor([[ 0.,  1.,  2.],
        [ 3.,  4.,  5.],
        [ 6.,  7.,  8.],
        [ 9., 10., 11.]])
'''


#1인 차원 제거
a = torch.FloatTensor([[0],[1],[2]]) #3*1
print( a.squeeze() ) #tensor([0., 1., 2.]) 3

#1인 차원 추가
a = a.squeeze() # (3,)
a = a.unsqueeze(0) #0번째에 1 추가 (3,) => (1,3)
print(a) #tensor([[0., 1., 2.]])
a = a.squeeze()
a = a.unsqueeze(1) #(3,) => (3,1)
print(a) #tensor([[0.],[1.],[2.]])


#연결
x = torch.FloatTensor([[1, 2], [3, 4]])
y = torch.FloatTensor([[5, 6], [7, 8]])
#행으로 추가
print( torch.cat([x,y], dim = 0) )  # tensor([[1., 2.], [3., 4.], [5., 6.], [7., 8.]])
print( torch.stack([x,y]) )         # tensor([[1., 2.], [3., 4.], [5., 6.], [7., 8.]])
#열로 추가
print( torch.cat([x,y], dim = 1) )  # tensor([[1., 2., 5., 6.], [3., 4., 7., 8.]])
728x90
반응형