カスタムDatasetとTransformの作成

MXNet(特にGluon API)において、データ処理の柔軟性を高めるためには、カスタムDatasetと**Transform(変換)**を自作することが重要です。これにより、独自形式のデータや前処理手法に対応できます。以下では、その仕組みと実装方法を詳しく説明します。


1. カスタムDatasetの作成

mxnet.gluon.data.Datasetを継承して独自のデータセットを作成できます。

基本構造

python
from mxnet.gluon.data import Dataset class MyCustomDataset(Dataset): def __init__(self, data_paths, transform=None): self.data_paths = data_paths self.transform = transform def __getitem__(self, idx): # データの読み込み(例: 画像ファイル) data = self.load_data(self.data_paths[idx]) label = self.get_label(self.data_paths[idx]) if self.transform is not None: data = self.transform(data) return data, label def __len__(self): return len(self.data_paths) def load_data(self, path): # 実際のデータ読み込み処理(例: OpenCVやPILなど) pass def get_label(self, path): # ラベルを返す処理(例: ファイル名や別ファイル参照など) pass

特徴

  • __getitem__:インデックスを指定してデータとラベルを返す

  • __len__:データセットの総数を返す

  • transform:必要に応じてデータに変換処理を適用


2. Transform(変換)の自作

Transformはデータ前処理(画像の正規化、リサイズ、ノイズ追加など)を行う関数またはクラスです。

単純な関数型

python
def my_transform(data): # 例:NumPy配列 → float32 に変換し正規化 data = data.astype('float32') / 255.0 return data

クラス型(オプションで引数付き)

python
class MyTransform: def __init__(self, scale=255.0): self.scale = scale def __call__(self, data): return data.astype('float32') / self.scale

3. DataLoaderとの併用例

カスタムDatasetとTransformを組み合わせてDataLoaderに渡すことで、ミニバッチ処理やシャッフルが可能になります。

python
from mxnet.gluon.data import DataLoader dataset = MyCustomDataset(data_paths=['img1.png', 'img2.png'], transform=my_transform) dataloader = DataLoader(dataset, batch_size=32, shuffle=True) for data, label in dataloader: # モデルへの入力などに利用 pass

4. 実用例(画像分類)

python
import cv2 import numpy as np class ImageDataset(Dataset): def __init__(self, image_paths, labels, transform=None): self.image_paths = image_paths self.labels = labels self.transform = transform def __getitem__(self, idx): img = cv2.imread(self.image_paths[idx]) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (224, 224)) if self.transform: img = self.transform(img) return img, self.labels[idx] def __len__(self): return len(self.image_paths)

まとめ

  • Datasetを継承してカスタムデータ読み込みクラスを作成可能

  • 任意のTransform関数を定義して柔軟な前処理を実装

  • DataLoaderと組み合わせて効率的なミニバッチ学習が可能

MXNet Gluonのこの柔軟なデータ処理設計により、様々な形式のデータや処理ニーズに対応できます。

生成日:2025/05/23