1. 텐서 다루기
torch 라이브러리 불러오기
import torch
import numpy as np
import pandas as pd
1) 텐서 만들기
torch.tensor(): 데이터 프레임은 제공되지않는다. 오류남
# 리스트
data = [[1, 2],[3, 4],[5, 6]]
x_data = torch.tensor(data)
x_data
# 넘파이 어레이
np_array = np.array(data)
x_np = torch.tensor(np_array)
x_np
2) 텐서의 속성
np.shape: 텐서의 형태
np.dtype: 텐서의 타입
np.device: 텐서의 디바이스
print(x_np)
print(f"Shape : {x_np.shape}")
print(f"Datatype : {x_np.dtype}")
print(f"Device : {x_np.device}")
- 텐서 생성 시에 데이터 타입을 지정해준다.
dtype=torch.float32
x_np = torch.tensor(np_array, dtype = torch.float32)
print(x_np)
print(f"Shape : {x_np.shape}")
print(f"Datatype : {x_np.dtype}")
print(f"Device : {x_np.device}")
3) Operations
- CPU VS GPU
텐서를 GPU로 사용가능하냐 CPU로 사용 가능하냐
딥러닝 돌릴거면 엔비디아 4090사고,,, CUDA 다운로드해야됨...고생했던기억.....
# GPU가 사용 가능한 경우에는 GPU에, 그렇지 않은 경우에는 CPU에 할당
if torch.cuda.is_available():
tensor = x_np.to("cuda")
else:
tensor = x_np.to("cpu")
# 텐서가 어느 디바이스에 할당되어 있는지 확인
print(tensor.device)
- 텐서를 이제 한번 만들어주면 numpy에서 봤던것처럼 마구잡이로 다룰 수 있게 된다.
np_array = np.array(data)
x_np = torch.tensor(np_array)
print(x_np)
print('='*30)
# 열, 행 인덱스로 조회
print(f"첫 행: {x_np[0]}")
print(f"첫 열: {x_np[:, 0]}")
print(f"마지막 열: {x_np[:, -1]}")
print('='*30)
# 값 수정
x_np[:,1] = 0
print(x_np)
- torch.cat
torch로 텐서 결합하기
일단 어레이를 텐서로 결합하고
np_array = np.array(data)
x_np = torch.tensor(np_array, dtype = torch.float32)
x_np
dim=0을 사용하면 열쪽에 결합된다.
t0 = torch.cat([x_np, x_np], dim=0)
print(t0)
dim=1을 사용하면 행쪽으로 결합된다.
t1 = torch.cat([x_np, x_np], dim=1)
print(t1)
4) 연산
- 집계함수
x_np.sum()
x_np.mean()
x_np.std()
print(x_np)
print(x_np.sum())
print(x_np.mean())
print(x_np.std())
- 행렬 곱: 선형대수 배웠듯이 행렬곱은 전치행렬 만들고 곱하기
y1 = x_np @ x_np.T
y2 = x_np.matmul(x_np.T)
print(y1)
print(y2)
- 이렇게 반대로 곱하면 결과값 달라진다.
y1 = x_np @ x_np.T
y2 = x_np.T @ x_np
print(y1)
print(y2)
- 요소 곱: 그냥 이거는 일렬로 곱하는것 같은 거 곱했으니까 제곱형태로 출력되겠죠?
z1 = x_np * x_np
z2 = x_np.mul(x_np)
print(z1)
print(z2)
- 텐서에서 값뽑기
.item()
agg = x_np.mean()
print(agg, type(agg))
print('='*30)
agg_item = agg.item() # .item()은 단일요소 텐서에서 사용 가능
print(agg_item, type(agg_item))
2. 데이터 셋 다루기
텐서로 결합하기위해 데이터로더, 텐서데이터 세트로 만들어서 활용하기위해 텐서 데이터세트 라이브러
from torch.utils.data import DataLoader, TensorDataset
1) 데이터 준비: 독립변수와 종속변수를 분리
data = pd.read_csv(path)
data = data[:10] # 10건만 저장하기.
target = 'Sales'
x = data.drop(target, axis=1)
y = data.loc[:, target]
print(x.shape, y.shape)
(10, 3) => 10개의 행과 3개의 열을 가진 2차원 배열 10개의 샘플에 각 샘플에 3개의 특징이 있는 입력 데이터
(10, ) => 10개의 정답라벨을 가진 1차원 배열
2) 텐서로 변환
torch.tensor(numpy array,)
- 일단 시리즈, 데이터프레임은 딥러닝에 안 먹히니까 넘파이로 어레이를 만들어줘라
x_np = x.values
y_np = y.values
# pandas dataframe, series를 numpy array로 변환
# 현재 자료형 타입
print(type(x), type(y))
print('='*50)
# 넘파이로 바꾸기
x_np = x.values
y_np = y.values
print(type(x_np), type(y_np))
print(x_np.shape, y_np.shape)
print('='*50)
# y도 2차원 구조가 필요.
y_np = y_np.reshape(10, 1) # 10행 1열 구조
print(x_np.shape, y_np.shape)
reshape 하는 이유는 모델에 입력하기 더 편한 상태로 바꾸기 위해서이다. x와 y를 같은형태로 만들어줘야 더 깔끔하기 때문에 만들어주는 것이다.
- 어레이로 만들었다면 텐서로 변환해라!
# 텐서로 변환
x_tensor = torch.tensor(x_np, dtype=torch.float32)
y_tensor = torch.tensor(y_np, dtype=torch.float32)
print(x_tensor.shape, y_tensor.shape)
각각의 텐서 생성
- 텐서 내용 확인
display(x_tensor[:5])
display(y_tensor[:5])
x 텐서: 10개의 샘플이 있고 각각은 3개의 특성을 가진다.
y 텐서: 정답라벨값 10개!
3) 텐서 만들었으면 데이터 로드하여 데이터 셋을 합치고 모델에 전달해주자
- TensorDataset(): 텐서 x,y를 하나의 텐서 데이터 셋으로 합치기
# TensorDataset 생성 : 텐서 데이터셋으로 합치기
dataset = TensorDataset(x_tensor, y_tensor)
print(dataset[:5])
그럼 이렇게 하나의 텐서로 결합되었고 x-y의 조합을 확인 할 수있다.
- DataLoador(): 합친 텐서를 모델에 전달해주기(값을 섞어서)
# 데이터 로더 생성
data_loader = DataLoader(dataset, batch_size = 3, shuffle = True)
- 잘 섞였는지 전달 받은 값 확인
# 데이터 로더로 부터 첫번째 배치 데이터 로딩
for (x_b, y_b) in data_loader:
print(x_b)
print(y_b)
break
잘 섞였다!
- 배치 단위로 한번 전달할 때마다 섞어보자
# 데이터 로더로부터 배치 단위로 데이터 로딩
for batch_id, (x_b, y_b) in enumerate(data_loader):
print(f'batch_id : {batch_id}')
print(x_b)
print(y_b)
print('='* 50)
3. device
cpu 상태: .numpy()
gpu 상태: .cpu().numpy()
모든 작업을 끝낸 텐서를 넘파이 어레이로 돌려주자... 고생했다 텐서야,, 사실 내가 더 고생 중