---
# System prepended metadata

title: 'Pytorch 筆記 : Dataset & DataLoader'
tags: [Pytorch 筆記]

---

###### tags: `Pytorch 筆記`
{%hackmd @kk6333/theme-sty1 %}
# Pytorch 筆記 : Dataset & DataLoader

### 0.Import
```python=
import torch            # pytorch 模組
import torch.nn as nn   # 用以建構神經網路
# 創建自訂 Dataset, Dataloader
from torch.utils.data import DataLoader, Dataset
```
---

<br>


### 1. 自製 Dataset
用 Pytorch 自製可讀取 Dataset 要用以下類別
並繼承 **Dataset** 類別
且一定要有這三個函數

- **init** : 用來初始化 dataset (也可以進行資料預處理)
- **getitem** : 之後會根據讀取的 index 回傳對應資料
- **len** : 獲得資料長度

```python=
# 製作 dataset
class MyDataset( Dataset ):
    def __init__(self, x, y):
        # 將 input data 轉為 pytorch Tensor
        self.x = torch.FloatTensor(x)
        self.y = torch.FloatTensor(y)
        
    def __getitem__(self, index):
        return self.x[index], self.y[index]
    
    def __len__(self):
        return len(self.x)
```

實例化 Dataset

```python=+
# 製作成 dataset
train_dataset = MyDataset(X_train, Y_train)
val_dataset = MyDataset(X_val, Y_val)
```
---

<br>

### 2. DataLoader
用來將 Dataset 分割成 Batch，
用在訓練、驗證時讀取資料

```python=+
# 做成 dataloader
# shuffle : 隨機資料分配
train_loader = DataLoader( train_dataset, batch_size, shuffle=True)
val_loader = DataLoader( val_dataset, batch_size, shuffle=True)
```

#### Dataloader 用法
利用迴圈可以將 dataloader 中的 batch 一個個的取出
```python=
for batch in train_loader:
    print(batch)       # batch 資料
```

也常常會使用 enumerate() 將每個 batch 對應到 index 編號

```python=
for batch_num, batch in enumerate(dataloader):
    print(batch_num)  # batch 編號
    print(batch)      # batch 資料
```

---

<br>

