第2章

データの準備と学習の仕組み

ラベル付け、データの分割、CNNの役割、過学習への対処を学びます。

この章で学ぶこと

  • 正解ラベルを一貫した基準で付ける
  • 学習用・検証用・テスト用にデータを分ける
  • CNNと、学習・推論の違いを説明する
  • 背景への依存や過学習を見つける

正解ラベルを決める

ここでは「ペン」「消しゴム」の写真を分類する課題を考えます。画像に付ける正解の種類をラベルと呼びます。撮影前に、対象は一つだけ写す、両方写った画像は今回のデータから外す、といった基準を決めます。

ラベルの基準が人によって違うと、モデルは矛盾した例から学ぶことになります。迷った画像を無理に分類せず、基準を見直してから付け直しましょう。

背景だけで答えが分からないようにする

ペンをすべて白い机、消しゴムをすべて黒い机で撮ると、モデルは道具の形ではなく背景の明るさを手掛かりにするかもしれません。各種類について、背景、角度、明るさ、距離を変えて撮影します。

同じペンを100回撮ることと、異なるペンを100本撮ることは同じではありません。新しい物にも使うなら、色や形の異なる個体を含めます。画像は自分で撮影したものや利用条件を確認したものを使い、個人情報が写り込んでいないかも確認します。

学習する前にデータを分ける

データ 役割 使うタイミング
学習用 モデルの内部の数値(重み)を調整する 学習中
検証用 学習回数やモデルの設定を選ぶ 開発中
テスト用 決めたモデルの性能を最終確認する 最後の評価

たとえば300枚を180枚・60枚・60枚に分ける設計が考えられます。この比率が唯一の正解ではなく、各種類の数と独立性が大切です。

連写や動画の隣り合うフレームを無作為に分けると、ほぼ同じ画像が学習用とテスト用に入ります。未知の画像への性能を測ったつもりでも、見覚えのある画像で評価することになります。これを防ぐため、撮影セッションや対象の個体を単位に分けます。新しいペンへの性能を測るなら、同じペンの写真が分割をまたがないようにします。

評価に使う情報が学習や設定の選択へ入り込むことを**データ漏洩(リーク)**と呼びます。画像を回転して増やす場合も、元の画像を分割した後、学習用だけに適用します。

CNNはどのように分類するか

**畳み込みニューラルネットワーク(CNN)**は、小さなフィルターを画像上で動かし、周囲の画素の組み合わせから特徴を取り出します。フィルターの数値も学習で調整されます。輪郭や模様などの特徴を段階的に組み合わせ、最後に種類ごとの出力を計算します。

画像と正解ラベル
      ↓
前処理 → CNNの予測 → 正解との差(損失)を計算
              ↑                  │
              └── 重みを調整 ────┘

このように重みを調整するのが学習です。学習した重みを使い、新しい画像の答えを計算するのが推論です。通常の推論では、画像を見せるだけで重みが更新されることはありません。

過学習とデータ拡張

学習用の画像ではよく当たるのに、検証用では当たらない状態は過学習の兆候です。学習回数を増やすだけでなく、データの偏りやラベルの誤りを調べます。

学習画像を回転したり明るさを変えたりして、入力の変化を増やす方法をデータ拡張と呼びます。ただし、変換後もラベルの意味が保たれる必要があります。数字の6を180度回しても、正解を6のままにしてよいとは限りません。また、加工画像を増やしても、異なる実物を集めたことにはなりません。

CNNの具体的な構成は、TensorFlow公式のCNNチュートリアルでも確認できます。

やってみよう

  1. 同じ動画から切り出した画像を1枚ずつ無作為に分けると、どんな問題がありますか。
  2. ペンと消しゴムの分類で、背景への依存を調べる実験を考えてください。
  3. 数字の画像に左右反転を使ってよいか、理由も含めて考えてください。

解答例

  1. 似たフレームが両方に入り、未知の場面への性能を過大に見積もる可能性があります。動画や撮影セッション単位で分けます。
  2. 同じ道具を異なる背景で撮り、予測が変わるかを検証用データで調べます。
  3. 反転すると通常の数字とは異なる形になるため、実際の利用条件で反転した文字を扱うかも含めて判断します。