tensorflow-deep-learning について
TensorFlow と Keras によるニューラルネットワークの開発、学習、評価、デプロイを支援するスキルです。再現可能な構成、入力検証、適切なデータ分割、明示的なモデル出力を重視します。
主な機能
- 01モジュール化されたプロジェクト構成
- 02スケーラブルな `tf.data` 入力パイプライン
- 03モデル開発と学習の実践手法
- 04タスクに応じた指標による評価
- 05明示的なサービングシグネチャでのエクスポート
- 06デプロイ前のスモークテストと監視
活用シーン
- 01再現可能なモデル学習プロジェクトの構成
- 02長時間の学習前にデータセットを検証
- 03テストデータの漏洩を防いだモデル評価
- 04モデルをエクスポートしてサービング用に動作確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill tensorflow-deep-learningインストール後、Claude Code で/tensorflow-deep-learningを入力して読み込まれたか確認します。
詳細
TensorFlow とディープラーニング
このスキルでは、TensorFlow と Keras で構築したニューラルネットワークのプロジェクト構成、モデル開発、トレーニング、評価、デプロイに関する実践方法を扱います。
モデルのトレーニングとリリースのワークフロー
- 役割をモジュールに分ける — データの読み込み、モデル定義、トレーニング、評価、サービングのコードを別々のファイルに分け、ノートブックは探索用途に限定します。
- まず入力パイプラインを構築する — スケーラブルなプリフェッチ付き入力処理には
tf.data.Datasetを使用します。モデルコードを書く前に、形状、データ型、ラベルの範囲、クラスバランスを検証します。 - フィッティングの前に分割する — データ漏洩を避けるため、正規化統計量やデータ拡張パラメーターをフィッティングする前に、トレーニング/検証/テスト用のデータに分割します。
- 小さなベースラインから始める — 小さなモデルを構築し、学習ループが機能することを確認するため、少数のサンプルに対して損失がほぼ 0 になるまで学習する過学習テストを実施してから、規模を拡大します。
- コールバックを使ってトレーニングする —
ModelCheckpoint(最終エポックではなく、検証指標が最良のモデルを保存)、EarlyStopping、学習率スケジュール、TensorBoardロギングを組み込みます。 - タスクに適した指標で評価する — 最終報告にのみ、学習で使用していないテストセットを使い、調整には決して使用しません。
- 明示的なシグネチャでエクスポートする —
model.export()またはtf.saved_model.save()で保存し、サービング用の入力シグネチャを明示的に定義します。 - エクスポートをスモークテストする — デプロイの前に、エクスポートしたモデルを読み込み、サンプル入力で推論を実行します。
プロジェクト構成
- データの読み込み、モデル定義、トレーニング、評価、サービングのコードを別々のモジュール(例:
data.py、model.py、train.py、evaluate.py、serve.py)に分けます。 - モデルのハイパーパラメーターは、トレーニングコード内にリテラルとして散在させず、型付きの設定オブジェクト(データクラス)または設定ファイルにまとめます。
- チェックポイント、ログ、エクスポートしたモデルは、ソースディレクトリの外(例:
artifacts/または設定済みの出力パス)に保存し、誤ってバージョン管理に含まれないようにします。 - ノートブックは探索用途に限定します。手法の有効性を確認したら、再実行可能なトレーニングコードを、スクリプトとして実行でき、テストの対象にもできるモジュールに移します。
project/
data.py # tf.data pipeline construction
model.py # Keras model definition
config.py # typed hyperparameter config
train.py # training loop / Keras fit orchestration
evaluate.py # metrics computation on held-out data
serve.py # export + inference smoke test
artifacts/ # checkpoints, logs, saved models (gitignored)
入力パイプライン(tf.data)
import tensorflow as tf
def build_dataset(file_pattern: str, batch_size: int, shuffle: bool) -> tf.data.Dataset:
files = tf.data.Dataset.list_files(file_pattern, shuffle=shuffle)
ds = files.interleave(
tf.data.TFRecordDataset,
cycle_length=tf.data.AUTOTUNE,
num_parallel_calls=tf.data.AUTOTUNE,
)
ds = ds.map(_parse_example, num_parallel_calls=tf.data.AUTOTUNE)
if shuffle:
ds = ds.shuffle(buffer_size=10_000)
ds = ds.batch(batch_size, drop_remainder=False)
return ds.prefetch(tf.data.AUTOTUNE)
def _parse_example(record: tf.Tensor) -> tuple[tf.Tensor, tf.Tensor]:
feature_spec = {
"features": tf.io.FixedLenFeature([32], tf.float32),
"label": tf.io.FixedLenFeature([], tf.int64),
}
parsed = tf.io.parse_single_example(record, feature_spec)
return parsed["features"], parsed["label"]
.map()/.interleave()にはnum_parallel_calls=tf.data.AUTOTUNEを使用し、パイプラインの最後には必ず.prefetch(tf.data.AUTOTUNE)を指定します。- バッチ処理の前にシャッフルし、データセットの規模に応じて、全件シャッフルに近づく十分な大きさのバッファーを使用します。
- 長時間のトレーニングを開始する前に、サンプルバッチでデータの形状、データ型、ラベルの範囲、クラスバランスを検証します。
モデル開発
- 特別な理由で低レベルの
tf.GradientTapeによる制御が必要な場合を除き、Keras のレイヤーとモデル(tf.keras.Model、tf.keras.Sequential)を使用します。 - 入力形状と名前付きの入力/出力を明示的に指定します。これにより、サービングシグネチャの定義やデバッグが容易になります。
- 小さなベースラインモデルから始め、深さ、幅、データセットの規模を拡大する前に、データの小さなサブセットを過学習できる(損失がほぼ 0 になる)ことを確認します。これにより、パイプラインや損失関数の不具合を早期に発見できます。
- 再現性が重要な場合は、乱数シード(
tf.random.set_seed、numpy.random.seed)を固定します。ただし、一部の GPU 演算(特定の cuDNN のリダクションなど)は、依然として非決定的になり得ることを明記します。 - 混合精度(
tf.keras.mixed_precision.set_global_policy("mixed_float16"))を有効にするのは、完全精度で数値的安定性を検証した後に限ります。損失の中には(logやexpを含むものなど)、アンダーフローを防ぐために損失スケーリングが必要なものがあります。
import tensorflow as tf
def build_model(input_dim: int, num_classes: int) -> tf.keras.Model:
inputs = tf.keras.Input(shape=(input_dim,), name="features")
x = tf.keras.layers.Dense(128, activation="relu")(inputs)
x = tf.keras.layers.Dropout(0.3)(x)
x = tf.keras.layers.Dense(64, activation="relu")(x)
outputs = tf.keras.layers.Dense(num_classes, activation="softmax", name="predictions")(x)
return tf.keras.Model(inputs=inputs, outputs=outputs, name="baseline_classifier")
トレーニング
import tensorflow as tf
model = build_model(input_dim=32, num_classes=10)
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),
loss="sparse_categorical_crossentropy",
metrics=["accuracy"],
)
callbacks = [
tf.keras.callbacks.ModelCheckpoint(
filepath="artifacts/checkpoints/best.keras",
monitor="val_accuracy",
save_best_only=True,
),
tf.keras.callbacks.EarlyStopping(
monitor="val_loss", patience=5, restore_best_weights=True,
),
tf.keras.callbacks.ReduceLROnPlateau(
monitor="val_loss", factor=0.5, patience=3, min_lr=1e-6,
),
tf.keras.callbacks.TensorBoard(log_dir="artifacts/logs"),
]
train_ds = build_dataset("data/train-*.tfrecord", batch_size=64, shuffle=True)
val_ds = build_dataset("data/val-*.tfrecord", batch_size=64, shuffle=False)
history = model.fit(
train_ds,
validation_data=val_ds,
epochs=50,
callbacks=callbacks,
)
- 正規化レイヤーやデータ拡張のパラメーターを適合させる前に、データをトレーニング/検証/テストに分割してください。データセット全体で適合させると、テストデータの統計情報がトレーニングに漏洩します。
- チューニング(アーキテクチャ、学習率、正則化)には検証セットを使用し、別のテストセットは最終報告専用として、一度だけ使用してください。
- すべての実行について、損失曲線、メトリクス、学習率、リソース使用率を記録してください(
TensorBoardまたは実験トラッカーを使用)。 - 最終エポックの重みだけでなく、検証メトリクスが最良のチェックポイントを保存してください(
save_best_only=True)。特にEarlyStoppingを使用する場合、最終エポックが最良とは限りません。
評価
- タスクに適したメトリクスを報告してください。分類では AUROC/F1/キャリブレーション、言語タスクではパープレキシティまたは BLEU/ROUGE、回帰では MAE/RMSE を使用します。
- 分類タスクでは、混同行列やクラスごとのエラー分析も含めてください。集約された正解率では、クラスレベルの失敗が隠れてしまいます。
- データが許す場合は、エッジケースや既知の分布シフトでも評価してください(例:異なる期間やソースから取り出したホールドアウトデータ)。
- データセットが小規模または表形式の場合は、ニューラルネットワークを使わないベースライン(ロジスティック回帰、勾配ブースティング木)と比較してください。単純なベースラインを下回るディープモデルは、注記ではなく重要な兆候です。
test_ds = build_dataset("data/test-*.tfrecord", batch_size=64, shuffle=False)
results = model.evaluate(test_ds, return_dict=True)
print(results) # {'loss': ..., 'accuracy': ...}
デプロイ
- サービングインフラストラクチャ(TF Serving、Vertex AI など)が入力の形状と dtype を把握できるよう、明示的な入力シグネチャを指定してモデルをエクスポートしてください。
model.export("artifacts/saved_model/v1")
# Or with an explicit serving signature:
@tf.function(input_signature=[tf.TensorSpec(shape=[None, 32], dtype=tf.float32, name="features")])
def serve_fn(features):
return {"predictions": model(features, training=False)}
tf.saved_model.save(model, "artifacts/saved_model/v1", signatures={"serving_default": serve_fn})
- トレーニングとサービングで前処理を同一に保ってください。ロジックをサービング側の別スクリプトに重複して実装するのではなく、エクスポートしたグラフに正規化やトークン化を組み込んでください(例:モデルの一部として
tf.keras.layers.Normalizationを使用)。 - モデルを本番環境に昇格させる前に、エクスポートした
SavedModelを読み込み、既知のサンプル入力をいくつか使って推論を実行し、出力が想定される範囲/形状に収まることを検証するスモークテストを追加してください。 - デプロイ後は、レイテンシー、メモリー、予測のドリフト、入力スキーマの変更を監視してください。エクスポート時に正しかったモデルも、上流データの変化に伴って気付かないうちに性能が低下することがあります。
よくある間違い
- ラベルとデータ品質を確認する前にアーキテクチャをチューニングすること。データの不具合は、どのようなアーキテクチャ変更よりも長く影響します。
- トレーニング用の分割データだけでなく、データセット全体で前処理やデータ拡張を適合させ、検証データやテストデータを漏洩させること。
- 不均衡なデータセットで正解率だけに頼ること。代わりに、適合率/再現率、F1、または AUROC を使用してください。
- 再現可能なトレーニングスクリプトや固定された依存関係のない、ノートブックだけのモデルをデプロイすること。
- トレーニングと推論でのバッチサイズ、dtype、デバイス(CPU/GPU)の違いを無視すること。数値結果が気付かないうちに変わる可能性があります(特に混合精度の場合)。
コメント
Markdown 対応