티스토리 뷰
1. 데이터 분할
train data | validation data | test data |
모델 학습 X_train : input feature y_train : label |
epoch 마다 성능 평가 → 모델 개선에 사용 |
모델 학습 후 최종 평가 |
2. train_data => 배치 사이즈로 분할 : DataLoader
- 학습 데이터가 매우 큰 경우, 시간이 오래 걸리고 메모리도 부족하고, 모든 데이터의 gradient를 한번에 계산하기 어렵다
- 데이터 행을 쪼개 일부만 먼저 넣어 성능을 평가하고 가중치를 업데이트 시키고, 또 일부 행을 입력하고 반복
1) 텐서 정의
- 일반적으로 1차원 데이터를 벡터, 2차원 데이터를 행렬, 3차원 데이터를 텐서라고 말하지만,
파이토치에서는 차원에 관계 없이 입력과 출력, 학습에 필요한 모든 데이터를 텐서 데이터타입으로 정의한다.
- 학습시 가중치W와 바이어스 b를 위해 미분이 필요한데 파이토치는 모든 텐서 데이터에서 자동미분 기능이 최적화
import torch
x_train = torch.Tensor([1,2,3,4,5,6]).view(6,1)
y_train = torch.Tensor([3,4,5,6,7,8]).view(6,1)
2) Dataset 정의
# 방법 1) TensorDataset 사용
# 데이터가 단순한 텐서 형태로 준비되어 있고, 추가적인 전처리 등이 필요하지 않은 경우
dataset = TensorDataset(x_train, y_train)
# 방법 2) Dataset클래스를 상속받아 데이터를 정의: getitem, len 꼭 구현
# 데이터 전처리, 동적 로딩, 다양한 입력 형태를 처리할 때 사용
from torch.utils.data import Dataset
class CustomDateset(Dataset):
def __init__(self, x_train, y_train): # 입력값, 출력값 정의
self.x_train = x_train
self.y_train = y_train
def __getitem__(self, index): # 해당 인덱스의 입력값과 출력값
return self.x_train[index], self.y_train[index]
def __len__(self): # 데이터 사이즈를 리턴
return self.x_train.shape[0]
dataset = CustomDateset(x_train, y_train)
3) DataLoder 정의: 배치사이즈로 데이터셋 나눠줌
from torch.utils.data import DataLoader
train_loader = DataLoader(dataset = dataset, batch_size=3, shuffle=True) # 3개행씩 입력
3. 텐서
1) 속성: shape, dtype, decive(저장되는 위치)
- GPU를 사용할 수 있다면, .to("cuda")메소드를 이용해 텐서를 GPU로 이동할 수 있다.
x_train.shape # torch.Size([6, 1])
x_train.dtype # torch.float32
x_train.device # device(type='cpu')
if torch.cuda.is_available():
x_train = x_train.to("cuda")
2) 딥러닝에서는 기본 데이터 타입이 float이다. dtype이 int인 경우 float으로 다시 정의해줘야 함
# float으로 변환해주는 torch.Tensor()
data= np.array([1,2,3,4,5])
tensor = torch.Tensor(data)
tensor.dtype # torch.float32
# int로 변환해주는 .from_numpy()
data= np.array([1,2,3,4,5])
tensor = torch.from_numpy(data)
tensor.dtype # torch.int32
# float으로 바꿔줘야한다.
tensor = torch.from_numpy(data).float()
tensor.dtype # torch.float32
3) random값 생성
torch.rand(2,2) # 0~1사이의 균일 분포의 랜덤값
torch.randn(2,2) # 평균이0, 분산이 1인 표준정규분포의 랜덤값(딥러닝에서 가중치와 바이어스를 초기화할때 가장 많이 사용)
4) tensor를 numpy로 변환: .numpy()
my_tensor = torch.Tensor([1,2,3,4,5]).view(5,1)
type(my_tensor) # numpy.ndarray
tensor_to_numpy = my_tensor.numpy()
type(tensor_to_numpy) # numpy.ndarray
5) tensor의 곱
- 동일한 위치의 요소 끼리의 곱 element-wise product (mul) : a * b
a = torch.Tensor([[1,2,3],
[4,5,6]])
b = torch.Tensor([[7,8,9],
[10,11,12]])
a*b
# 또는
a.mul(b)
# tensor([[ 7., 16., 27.],
# [40., 55., 72.]])
- 원래 행렬 곱(내적 곱) matrix multiplicaton (matmul) : a(2,3) @ b(3,2) 앞의 열과 뒤의 행의 수가 일치해야 함 (3)
- matmul은 브로드캐스팅이 일어나므로 혼동을 피하려면 mm을 쓰는게 나을 수 있음
a = torch.Tensor([[1,2,3],
[4,5,6]])
c = torch.Tensor([[7,8]
,[9,10,]
,[11,12]])
a @ c
# 또는
a.matmul(c)
# tensor([[ 58., 64.],
# [139., 154.]])
6) 텐서 합치기
torch.cat([a,b], dim=0) # 밑으로 쌓기(행이 늘어남)
torch.cat([a,b], dim=1) # 옆으로 쌓기(열이 늘어남)
7) reshape대신 view사용
- view: reshape과 동일하게 tensor의 shape을 변환
- squeeze: 차원의 개수가 1인 차원을 삭제(압축)
- unsqueeze: 차원의 개수가 1인 차원을 추가
'AI > 딥러닝' 카테고리의 다른 글
[딥러닝] Pytorch Troubleshooting (GPU) (1) | 2024.12.09 |
---|---|
[딥러닝] PyTorch 신경망 모델 구축 baseline (1) | 2024.12.06 |
[딥러닝] 프레임워크 비교(Tensorflow, Keras, PyTorch) (2) | 2024.12.04 |
[딥러닝] 공유 받은 구글 드라이브 알집 파일 colab에서 내 구글드라이브로 저장시키고 알집풀기 (0) | 2024.12.03 |
[딥러닝] 언제 딥러닝이 필요할까? (1) | 2024.11.29 |
- Total
- Today
- Yesterday
- SQL
- 빅데이터 분석기사
- opic
- 스크랩
- llm
- 운동
- 아침
- 뉴스
- 미라클모닝
- 습관
- 실기
- 프로그래머스
- 줄넘기
- 오블완
- 오픽
- IH
- Python
- 경제
- C언어
- 아침운동
- 루틴
- 고득점 Kit
- 티스토리챌린지
- ChatGPT
- 30분
- Ai
- 기초
- 다이어트
- 갓생
- 영어회화
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |