メインコンテンツまでスキップ

HDF5 データセットで学習する

プラットフォームがエクスポートした HDF5 データセットは、プラットフォーム外の学習フレームワークが読み取ります。学習に接続する前に、データの準備、フィールドの読み取り、構造の確認を済ませます。

対象ロールと前提条件​

ロールと関心事​

ロール関心事
アルゴリズムエンジニアフィールドの形状、フレームのアラインメント、学習フレームワークへの接続
学習運用データセットのマウント、VRAM とディスクの使用量

前提条件​

項目要件
データセットHDF5 のエクスポートが完了し、アーカイブをダウンロード済みであること。構造は HDF5 データセット を参照してください
ファイル解凍後に chunk_*.hdf5 が含まれていること
フィールド各 episode に少なくとも action と observation.state が含まれていること
実行環境h5py、numpy、および対象フレームワーク(PyTorch、TensorFlow、JAX のいずれか)を含む Python 環境
画像のデコードJPEG をデコードできること(Pillow、OpenCV、または torchvision)
リソース学習マシンのディスクが、解凍後のチャンクファイルと checkpoint を格納できること

手順​

  1. アーカイブを解凍し、すべてのチャンクファイルが同じディレクトリにあることを確認します。
  2. 1 つのチャンクファイルを開き、data 配下の episode 一覧と各データセットの形状を読み取り、HDF5 データセット のフィールド表と形状表に一致するか確認します。
import h5py

with h5py.File("chunk_001.hdf5", "r") as f:
for episode_name in f["data"]:
episode = f[f"data/{episode_name}"]
print(episode_name, episode.attrs["task"].decode())
for key in episode:
print(" ", key, episode[key].shape, episode[key].dtype)
  1. (チャンクファイルのパス, episode 名) のインデックスを作成し、epoch ごとにファイルを走査し直さないようにします。
  2. episode 単位で学習セットと検証セットを分割し、同じチャンクファイルが両方のセットにまたがらないようにして、同源サンプルの漏洩を避けます。
  3. 読み取り時は observation.images.* をフレームごとに JPEG デコードし、action、observation.state、observation.gripper とフレームインデックスでアラインメントします。
  4. episode を対象フレームワークのデータセットオブジェクトとしてラップし、画像テンソルと状態・動作ベクトルをバッチ単位で出力します。
  5. task、task_zh、score 属性を読み取り、タスクや品質によるサンプルの絞り込みに使用します。

最小構成のローダーの例:

import io
import h5py
import numpy as np
import torch
from PIL import Image
from torch.utils.data import Dataset

class Hdf5EpisodeDataset(Dataset):
def __init__(self, files, transform=None):
self.index = []
self.transform = transform
for path in files:
with h5py.File(path, "r") as f:
self.index += [(path, name) for name in f["data"]]

def __len__(self):
return len(self.index)

def __getitem__(self, i):
path, name = self.index[i]
with h5py.File(path, "r") as f:
ep = f[f"data/{name}"]
images = [Image.open(io.BytesIO(frame.tobytes()))
for frame in ep["observation.images.camera_01"][:]]
if self.transform:
images = [self.transform(img) for img in images]
return {
"images": torch.stack(images),
"state": torch.as_tensor(np.asarray(ep["observation.state"][:]), dtype=torch.float32),
"action": torch.as_tensor(np.asarray(ep["action"][:]), dtype=torch.float32),
"task": ep.attrs["task"].decode(),
}

結果の確認​

確認項目方法合格基準
ファイルの完全性解凍ディレクトリ内のチャンクファイルを一覧表示します命名が連続しており、欠番がありません
フィールドの網羅data 配下の各 episode を走査しますaction、observation.state を含み、少なくとも 1 つの observation.images.* を含みます
形状の一致各データセットの shape を読み取ります各データセットの先頭次元がその episode のフレーム数と等しいこと
画像のデコード可否observation.images.* の要素をサンプリングしますJPEG のデコードに成功します
フレームのアラインメントaction と observation.state の行数を比較します行数が等しいこと

エラー時の対処​

現象考えられる原因対処責任者
ファイルを開けないダウンロードの中断、または解凍の不完全再ダウンロードし、ファイルサイズを確認します利用者
observation.gripper がないエクスポート元にグリッパのトピックがない学習時にこのフィールドを無視するか、動作次元の設定から除外しますアルゴリズムエンジニア
画像のデコードに失敗するそのフレームが JPEG ではなく生の配列であるuint8 配列として自前でデコードするか、そのフレームを除外しますアルゴリズムエンジニア
各データセットのフレーム数が一致しないsidecar JSON のサブタスク区間とメッセージの時刻がずれているaction のタイムスタンプを基準にリサンプリングしますアルゴリズムエンジニア
VRAM が不足する1 バッチで読み込む画像が多すぎるバッチサイズを下げるか、画像の解像度を下げますアルゴリズムエンジニア
学習指標が収束しないフレームレートのサンプリングが低すぎる、または状態と動作がずれているエクスポートの hz を上げ、トピックの対応とフレームのアラインメントを確認しますアルゴリズムエンジニア

関連ページ​