티스토리 뷰

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인 차원을 추가

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함