728x90
반응형
*해당 글은 학습을 목적으로 위의 포스팅 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.
상세한 내용 및 전체 내용 확인을 원하신다면 도서 구매를 추천드립니다.
파이토치 패키지 기본 구성
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
반응형
'IT 도서 > Pytorch로 시작하는 딥 러닝 입문' 카테고리의 다른 글
06. 합성곱 신경망 (Convolution Neural Network) (0) | 2021.03.02 |
---|---|
05. 인공 신경망 (Artificial Neural Network) (0) | 2021.03.02 |
04. 소프트맥스 회귀 (Softmax Regression) (0) | 2021.03.01 |
03. 로지스틱 회귀 (Logistic Regression) (0) | 2021.03.01 |
02. 선형 회귀 (Linear Regression) (0) | 2021.03.01 |