Data science/딥러닝

[딥러닝] 2. Pytorch

endingo 2025. 4. 5. 23:21

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) 데이터 준비: 독립변수와 종속변수를 분리

path = '~.csv'
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()

 

모든 작업을 끝낸 텐서를 넘파이 어레이로 돌려주자... 고생했다 텐서야,, 사실 내가 더 고생 중

x_tensor.numpy()