no image
[PyTorch] DataLoader 기초 및 구현
안녕하세요, 오늘은 PyTorch의 가장 중요한 구성 요소 중 하나인 DataLoader에 대해 자세히 알아보려고 합니다. 이 포스트에서는 DataLoader의 기능, 파라미터, 그리고 실제 사용 예시에 대해 소개해드리려고 합니다. DataLoader란? PyTorch의 'DataLoader'는 'Dataset' 클래스의 데이터들을 불러오게 하는 데이터셋 객체입니다. 모든 Dataset은 DataLoader로 생성하며 DataLoader는 모델 훈련을 위한 데이터를 준비하는 과정을 쉽고 효율적으로 만들어 줍니다. DataLoader를 사용해야하는 이유는 다음과 같습니다. 미니배치 : 'DataLoader'은 데이터셋을 미니배치로 나누어 학습을 가능하게 하여 각자의 GPU 환경에 맞춰서 학습할 수 있도록 ..
2024.03.17
no image
[PyTorch] Dataset 기초 및 구현
안녕하세요. 오늘은 인공지능과 딥러닝에서 매우 많이 사용하는 PyTorch의 'Dataset'에 대해 자세하게 설명해보려고 합니다. 인공지능과 딥러닝에서 모델을 학습시키기 위해 Data를 처리하는 코드는 복잡하고 유지보수가 어려울 수 있습니다. 이를 위해 PyTorch에서는 더 나은 가독성과 모듈성을 위해 데이터셋 코드를 분리합니다. 이 글에서 PyTorch의 'Dataset'은 클래스를 직접 구현해 보며 이해해보려고 합니다. Dataset이란? PyTorch에서 Dataset은 데이터와 레이블을 저장하고 있으며, 데이터에 쉽게 접근할 수 있도록 도와주는 추상 클래스입니다. 이 클래스를 사용하여 다양한 데이터 소스(예: 파일, 데이터베이스, 메모리 등)에서 데이터를 불러오고, 필요한 전처리 작업을 수행할..
2024.03.16
no image
[PyTorch] RuntimeError: The NVIDIA driver on your system is too old. 오류 해결법
오늘은 GPU 버전 오류에 대해 포스팅을 하려고 합니다. 최근에 GPU를 이용해서 인공지능 모델을 학습시키려고 하는데 다음과 같은 오류가 발생했습니다. RuntimeError: The NVIDIA driver on your system is too old (found version 11040). Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with you..
2023.12.31
no image
[PyTorch] torch.ne, torch.eq 에 대해 알아보자
참고링크 : https://pytorch.org/docs/stable/generated/torch.ne.html torch.neimport torchtorch.ne(input, other,*, out=None)# tensor을 반환한다. Parameter:input(tensor) - 비교할 텐서other(Tensor or float) - 비교할 텐서 또는 값Keyword Arguments:out(Tensor, optional) - 반환 텐서Returns:input과 output이 같으면 False, 다르면 True를 반환한다. Example:>>> import torch>>> torch.ne(torch.tensor([[1, 2], [3, 4]]), torch.tensor([[1, 1], [4, 4]]))..
2023.09.13
no image
[Pytorch] torch.multinomial, multinomial
torch.multinomial multinomial 함수는 텐서안에 있는 값들을 통해 무작위로 샘플링을 수행합니다. 텐서를 반환하며, 각 행은 텐서 입력의 해당 행에 위치한 다항 확률 분포(input_tensor)로부터 추출된 num_samples 개의 인덱스를 포함합니다. 입력의 행들은 합이 반드시 1이 될 필요는 없습니다.( 이 경우에는 값을 가중치로 사용) 그러나 음수가 아니어야 하며, 유한해야 하고, 합이 0이 아니어야 합니다. 함수 선언 import torch torch.multinomial(input, num_samples, replacement=False, *, generator=None, out=None) → LongTensor 파라미터 input(Tensor) - 확률을 포함한 Tens..
2023.09.07
no image
[Pytorch] numpy to tensor, tensor to numpy, 넘파이와 텐서 변환
numpy 에서 tensor로 변환하는 방법에 대해 알아보겠습니다. 데이터를 tensor을 생성하는 방법은 2가지가 있습니다. tensor을 생성하거나 numpy 배열을 tensor로 바꾸는 것이 있습니다. 왜 tensor을 사용하는가? 1. 대부분의 딥 러닝 framework( TensorFlow, Pytorch) 에서는 Tensor을 기본 데이터 구조로 사용하기 때문입니다. 2. tensor은 자동으로 미분을 해주며 역전파 계산을 해줍니다. 3. Tensorflow와 Pytorch 같은 딥 러닝 framework는 GPU를 활용해 더욱 빠른 연산을 할 수 있습니다. 데이터를 tensor로 만들거나 numpy 배열을 tensor 로 변환합니다. 4. 고차원의 배열을 numpy보다 tensor가 효과적으..
2023.09.06
728x90

안녕하세요, 오늘은 PyTorch의 가장 중요한 구성 요소 중 하나인 DataLoader에 대해 자세히 알아보려고 합니다. 이 포스트에서는 DataLoader의 기능, 파라미터, 그리고 실제 사용 예시에 대해 소개해드리려고 합니다.

 

DataLoader란?


PyTorch의 'DataLoader'는 'Dataset' 클래스의 데이터들을 불러오게 하는 데이터셋 객체입니다. 모든 Dataset은 DataLoader로 생성하며 DataLoader는 모델 훈련을 위한 데이터를 준비하는 과정을 쉽고 효율적으로 만들어 줍니다.

DataLoader를 사용해야하는 이유는 다음과 같습니다.

  • 미니배치 : 'DataLoader'은 데이터셋을 미니배치로 나누어 학습을 가능하게 하여 각자의 GPU 환경에 맞춰서 학습할 수 있도록 합니다.
  • 데이터 셔플링 : 학습 과정에서 데이터를 무작위로 섞어주는 기능을 제공하여, 일반화 능력을 향상합니다.
  • 병렬 데이터 로딩: num_workers 파라미터를 통해 다중 프로세스를 사용하여 데이터 로딩 시간을 단축시킬 수 있습니다. 이는 특히 대규모 데이터셋을 다룰 때 학습 시간을 크게 줄여줍니다.
  • 사용자 정의 데이터 처리: collate_fn을 사용하여 배치 데이터를 생성하는 과정에서 사용자 정의 데이터 처리 로직을 적용할 수 있습니다. 이는 다양한 형태의 데이터(예: 이미지의 크기가 다른 경우, 텍스트 데이터의 길이가 다른 경우)를 효과적으로 처리할 수 있게 해 줍니다.
  • 데이터 로딩의 유연성: 다양한 소스에서 데이터를 로딩할 수 있는 유연성을 제공합니다. Dataset 추상 클래스를 상속받아 파일 시스템, 데이터베이스, 온라인 소스 등에서 데이터를 쉽게 로딩할 수 있습니다.

 

DataLoader의 정의

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
           batch_sampler=None, num_workers=0, collate_fn=None,
           pin_memory=False, drop_last=False, timeout=0,
           worker_init_fn=None)

 

주요 파라미터 설명

파라미터 설명
dataset (Dataset) 로딩할 대상 데이터셋. PyTorch의 Dataset 인스턴스
batch_size(bool, optional) 한 번에 로드할 데이터의 개수. 이 값에 따라 모델의 메모리 사용량과 훈련 속도가 달라질짐.
shuffle (bool, optional) 데이터를 로드하기 전에 무작위로 섞을지의 여부. 일반적으로 훈련 데이터셋에는 True를 설정.
num_workers (int, optional) 데이터 로딩을 위해 사용할 프로세스의 수. 이 값을 늘림으로써 데이터 로딩 속도를 향상시킬 수 있음.  무작정 많이 올린다고 속도가 향상되는 것은 아님
collate_fn (callable, optional) 배치 데이터를 처리하는 사용자 정의 함수. 데이터셋에서 샘플을 배치로 묶는 방법을 커스터마이징.
drop_last (bool, optional) 마지막 배치의 데이터 수가 batch_size보다 적을 경우 이를 버릴지에 대한 여부.

 

 

 

 

구현 예제


Dataset 구현 코드

더보기

데이터셋 구현 코드 

import torch
from torch.utils.data import Dataset

# 사용자 정의 데이터셋 클래스
class CustomDataset(Dataset):

	# 생성자, 데이터를 전처리하는 부분
    def __init__(self, length=100):
        self.data = torch.randn(length, 10)  # 임의의 데이터 생성 (예: 100x10 텐서)
        self.labels = torch.randint(0, 2, (length,))  # 임의의 레이블 생성 (0 또는 1)

	# Dataset 클래스의 길이를 반환
    def __len__(self):
        return len(self.data)

	# 데이터셋의 데이터중 idx위치의 Data를 반환하는 코드
    def __getitem__(self, idx):
        sample = self.data[idx]
        label = self.labels[idx]

        return sample, label
        
# 데이터셋 생성
dataset = CustomDataset()

 

from torch.utils.data import DataLoader

# DataLoader의 파라미터를 사용하는 예시

# DataLoader 인스턴스 생성
data_loader = DataLoader(
    dataset=dataset,      	# 사용할 데이터셋
    batch_size=24,      	# 배치 사이즈 설정: 한 번에 로드할 데이터의 개수
    shuffle=True,          	# 데이터 셔플링 활성화: 데이터를 무작위로 섞음
    num_workers=4,         	# 병렬 데이터 로딩을 위한 프로세스 수: 데이터 로딩 속도 향상
    drop_last=True         	# 마지막 배치 드롭 설정: 마지막 배치의 데이터 수가 batch_size보다 적을 경우 이를 버릴지 여부
)

# 설명
# batch_size


# DataLoader를 사용하여 데이터 로딩 및 처리 예시
for data, labels in data_loader:
    print(f"Batch shape: {data.shape}, Labels shape: {labels.shape}")

# 실행결과
Batch length: 24, Batch shape: torch.Size([24, 10]), Labels shape: torch.Size([24])
Batch length: 24, Batch shape: torch.Size([24, 10]), Labels shape: torch.Size([24])
Batch length: 24, Batch shape: torch.Size([24, 10]), Labels shape: torch.Size([24])
Batch length: 24, Batch shape: torch.Size([24, 10]), Labels shape: torch.Size([24])

 

설명

DataLoader에서 Data는 100개를 가지고 있으며 Batch size는 24입니다. Batch size를 24로 설정하면 DataLoader은 24개의 데이터를 담은 미니배치로 분할합니다. 총 데이터는 100개이므로, 이는 DataLoader가 총 5개의 미니배치를 가지며 4개의 미니배치는 24개의 데이터(24 * 4 = 96)와 1개의 미니배치는 4개의 데이터를 갖고 있습니다.

이 때, 데이터셋의 총 크기(100)가 배치 크기(24)로 정확히 나누어 떨어지지 않기 때문에, 마지막 배치는 나머지 데이터로 구성됩니다. 이 경우 마지막 배치에는 4개의 데이터 포인트만 포함됩니다. 'drop_last=True' 파라미터에 의해 마지막 배치는 학습과정에 포함되지 않습니다.

 

728x90
728x90

안녕하세요. 오늘은 인공지능과 딥러닝에서 매우 많이 사용하는 PyTorch의 'Dataset'에 대해 자세하게 설명해보려고 합니다. 인공지능과 딥러닝에서 모델을 학습시키기 위해 Data를 처리하는 코드는 복잡하고 유지보수가 어려울 수 있습니다. 이를 위해 PyTorch에서는 더 나은 가독성과 모듈성을 위해 데이터셋 코드를 분리합니다. 

이 글에서 PyTorch의 'Dataset'은 클래스를 직접 구현해 보며 이해해보려고 합니다.

 

 

Dataset이란?


PyTorch에서 Dataset은 데이터와 레이블을 저장하고 있으며, 데이터에 쉽게 접근할 수 있도록 도와주는 추상 클래스입니다. 이 클래스를 사용하여 다양한 데이터 소스(예: 파일, 데이터베이스, 메모리 등)에서 데이터를 불러오고, 필요한 전처리 작업을 수행할 수 있습니다. 

요약하자면, Dataset은 샘플과 정답들을 저장하는 클래스라고 생각하시면 됩니다.

 

기본적으로 Dataset 클래스는 다음 세 가지 메서드를 구현해야 합니다.

  • __init__: 필요한 변수들을 선언합니다.  init 함수는 Dataset 객체가 생성될 때 한 번만 실행됩니다.
  • __len__: 데이터셋의 총 데이터 개수를 반환합니다
  • __getitem__: 주어진 인덱스에 해당하는 샘플을 데이터셋에서 불러와 반환합니다.

 

 

구현 예제


import torch
from torch.utils.data import Dataset

# 사용자 정의 데이터셋 클래스
class CustomDataset(Dataset):

	# 생성자, 데이터를 전처리하는 부분
    def __init__(self, length=100):
        self.data = torch.randn(length, 10)  # 임의의 데이터 생성 (예: 100x10 텐서)
        self.labels = torch.randint(0, 2, (length,))  # 임의의 레이블 생성 (0 또는 1)

	# Dataset 클래스의 길이를 반환
    def __len__(self):
        return len(self.data)

	# 데이터셋의 데이터중 idx위치의 Data를 반환하는 코드
    def __getitem__(self, idx):
        sample = self.data[idx]
        label = self.labels[idx]

        return sample, label
        
# 데이터셋 생성
dataset = CustomDataset()

 

실행결과

>>>len(dataset) # 데이터셋의 길이는 100
100

>>>dataset[0]	# 데이터셋의 첫번째 데이터의 값(샘플, label)
(tensor([ 0.5283, -0.5272, -1.0905,  0.4210,  0.2976, -0.2760, -0.8738,  1.0800,
         -1.9537, -0.2197]), 
tensor(0))

 

 

마치며

PyTorch의 Dataset 클래스를 사용하면 다양한 데이터 소스에서 데이터를 효율적으로 불러오고, 전처리하는 과정을 간소화할 수 있습니다. 사용자 정의 Dataset을 만들 때는 __len__과 __getitem__ 메서드를 구현해야 한다는 점을 기억해주세요.

728x90
728x90

오늘은 GPU 버전 오류에 대해 포스팅을 하려고 합니다.

최근에 GPU를 이용해서 인공지능 모델을 학습시키려고 하는데 다음과 같은 오류가 발생했습니다.

 
RuntimeError: The NVIDIA driver on your system is too old (found version 11040). Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver.
 
 
왜 발생하는가?

NVIDIA driver의 버전이 오래됨

버전확인하는 방법

$ nvidia-smi

위의 코드를 입력하면 우상단에 CUDA Version 확인

다음과 같이 CUDA Version을 확인할 수 있습니다.

해결하는 방법은?

해결하는 방법은 2가지입니다.

  • NVIDIA driver 최신 버전 설치
  • PyTorch 최신 버전 또는 GPU에 맞는 버전 설치

그 중에서 PyTorch 설치 방법에 대해 소개해드리려고 합니다.

첫 번째  PyTorch 홈페이지에 접속한다.

https://pytorch.org/get-started/previous-versions/

 

Previous PyTorch Versions

Installing previous versions of PyTorch

pytorch.org

 

두 번째, 자신의 OS와 이전 CUDA버전보다 최신 버전의 CUDA를 찾습니다.

저는 Linux를 사용하며 이전 버전이 11.4였기 때문에 11.7 버전을 설치할겁니다.

$ pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117

 

 

3. 코드 입력

사진과 같이 Jupyter Notebook에 실행하고 커널을 재시작합니다.

 

그럼 정상적으로 오류를 출력하지 않고 작동합니다.

728x90
728x90

참고링크 : https://pytorch.org/docs/stable/generated/torch.ne.html

 

torch.ne

import torch

torch.ne(input, other,*, out=None)

# tensor을 반환한다.

 

Parameter:

  • input(tensor) - 비교할 텐서
  • other(Tensor or float) - 비교할 텐서 또는 값

Keyword Arguments:

  • out(Tensor, optional) - 반환 텐서

Returns:

  • input과 output이 같으면 False, 다르면 True를 반환한다.

 

Example:

>>> import torch
>>> torch.ne(torch.tensor([[1, 2], [3, 4]]), torch.tensor([[1, 1], [4, 4]]))
tensor([[False, True], [True, False]])

torch.eq

 

참고링크 : https://pytorch.org/docs/stable/generated/torch.ne.html

 

import torch

torch.eq(input, other,*, out=None)

# tensor을 반환한다.

 

Parameter:

  • input(tensor) - 비교할 텐서
  • other(Tensor or float) - 비교할 텐서 또는 값

Keyword Arguments:

  • out(Tensor, optional) - 반환 텐서

Returns:

  • input과 output이 같으면 True, 다르면 False를 반환한다.

 

왜 사용하는가

저 같은 경우는 Sequen 모델에서 가변 길이 Sequence를 처리할 때 사용을 했습니다.

torch.ne -> Mask Index인 경우 같으면 False로 바꾸어 유효한 데이터만 True로 반환되도록 함수를 사용했습니다.

torch.eq -> 유효한 데이터 중에서 값이 똑같은 Index들은 정답을 맞췄기에 True로 반환되도록 하여 정확도 계산에 사용되도록 했습니다.

두 함수는 필요없는 데이터와 필요있는 데이터를 구분하고 필요한 데이터 중에서 올바른 데이터만 계산하는 accuracy를 구할 때 사용했습니다.

728x90
728x90

torch.multinomial

multinomial 함수는 텐서안에 있는 값들을 통해 무작위로 샘플링을 수행합니다. 

텐서를 반환하며, 각 행은 텐서 입력의 해당 행에 위치한 다항 확률 분포(input_tensor)로부터 추출된 num_samples 개의 인덱스를 포함합니다.

 

입력의 행들은 합이 반드시 1이 될 필요는 없습니다.( 이 경우에는 값을 가중치로 사용) 그러나 음수가 아니어야 하며, 유한해야 하고, 합이 0이 아니어야 합니다.

 

함수 선언

import torch
torch.multinomial(input, num_samples, replacement=False, *, generator=None, out=None) → LongTensor

파라미터

  • input(Tensor) - 확률을 포함한 Tensor ( 꼭 합이 1일 필요가 없으며, 모든 요소가 0 이상의 정수이며 합이 0이상)
  • num_samples(int) - 각 행에서 뽑을 sample 의 갯수
  • replacement(bool, optional) - 복원 추출에 대한 여부입니다.(추출하고서 없앨 것인지 아닌지)

 

함수 사용하는 방법

import torch
probs = torch.tensor([[0.1, 0.2, 0.3, 0.4, 0.0]], dtype=torch.float)

# 각 행에서 3개의 샘플을 추출
samples = torch.multinomial(probs, num_samples=3)

print(samples)

# Output
# tensor([[1, 2, 3]])

 * 확률 높은 것으로 뽑는 것이 아닌 확률을 통해서 인덱스를 랜덤하게 뽑습니다.

확률이 0인 4번째 index는 한번도 나오지 않는 것을 알 수 있습니다.

 

replcement = True

import torch
probs = torch.tensor([[0.1, 0.2, 0.3, 0.4, 0.0]], dtype=torch.float)

samples = torch.multinomial(probs, num_samples=3,replacement=True)

print(samples)

# Output
# tensor([[2, 2, 1]])

뽑은 index가 또 뽑힐 수 있습니다.

 

함수가 오류날 경우

import torch
# tensor 안에 inf, nan, 0보다 이하 요소가 포함될 경우
# RuntimeError 발생
probs = torch.tensor([[-0.1, 0.2, 0.3, 0.4, 0.0]], dtype=torch.float)


samples = torch.multinomial(probs, num_samples=3)

print(samples)

# Output
# RuntimeError: probability tensor contains either `inf`, `nan` or element < 0

 

728x90
728x90

 

numpy 에서 tensor로 변환하는 방법에 대해 알아보겠습니다. 데이터를 tensor을 생성하는 방법은 2가지가 있습니다. tensor을 생성하거나 numpy 배열을 tensor로 바꾸는 것이 있습니다. 

 

왜 tensor을 사용하는가?

1. 대부분의 딥 러닝 framework( TensorFlow, Pytorch) 에서는 Tensor을 기본 데이터 구조로 사용하기 때문입니다.

2. tensor은 자동으로 미분을 해주며 역전파 계산을 해줍니다. 

3. Tensorflow와 Pytorch 같은 딥 러닝 framework는 GPU를 활용해 더욱 빠른 연산을 할 수 있습니다. 데이터를 tensor로 만들거나 numpy 배열을 tensor 로 변환합니다.

4. 고차원의 배열을 numpy보다 tensor가 효과적으로 처리할 수 있기에 사용합니다.

 

Tensor 생성

torch.Tensor( )

tensor을 반환합니다.

import torch
tf = torch.Tensor([1,2])
print(tf)

# Output
# tensor([1., 2.])

 

Numpy to Tensor

torch.from_numpy( )

numpy를 tensor로 변환한 뒤 반환합니다.

import torch
import numpy as np

a=np.array([1,2,3,4])
b=torch.from_numpy(a)
print(b)

# Output
# tensor([1, 2, 3, 4])

 

Tensor to Numpy

numpy( )

tensor을 numpy로 변환한 뒤 반환합니다.

import torch
import numpy as np


a = torch.rand(3,3)
b = a.numpy()

print(b)

# [[0.229119   0.00697333 0.46128327]
#  [0.92042404 0.55823183 0.16318232]
#  [0.16195619 0.35052514 0.5872609 ]]
728x90