VISION / LESSON 10

画像の数値を同じ基準で比べる

画像の明るさを表す数値を、学習用データで決めた基準に合わせて変換しよう。

図から学ぶ
画像の数値を同じ基準で比べるを表すキャラクターと学習内容のイラスト
TODAY'S GOAL

この回でつかむこと

画像の数値を正規化する理由と、平均・標準偏差の役割を説明できる。

ことばの窓
01 / SEE THE IDEA

画像の数値を同じ基準で比べるって何だろう?

画像を数の表として見ると、各画素の値は明るさを表します。平均はその値の中心、標準偏差は散らばりの大きさです。平均を引いて標準偏差で割ると、学習時とテスト時の画像を同じ計算の基準で扱えます。この変換を、ここでは正規化と呼びます。

あおい

同じ絵でも、全体が明るいと数字が変わっちゃうね。

AI先生

そうなんだよ。まず画像の数値の中心と散らばりを調べよう。学習用画像で決めた計算方法を、ほかの画像にも同じように使うんだよ。

はる

基準に使う平均と標準偏差は、学習用画像から計算するのですね。

同じ基準の数に変える。元の平均は3。平均との差を約2.24で割る。平均0付近の値になる。
図10 同じ基準の数に変える。元の平均は3。平均との差を約2.24で割る。平均0付近の値になる。

はる テスト用にも、学習用で決めた同じ基準を使います。

図を読むと

学習用画像から求めた平均と標準偏差を使い、テスト用画像も同じ式で変換する。 画像を数の表として見ると、各画素の値は明るさを表します。平均はその値の中心、標準偏差は散らばりの大きさです。平均を引いて標準偏差で割ると、学習時とテスト時の画像を同じ計算の基準で扱えます。この変換を、ここでは正規化と呼びます。

小さなコードで確かめるまず結果を予想しよう
import torch
image = torch.tensor([[0.,2.],[4.,6.]])
mean = image.mean()
std = image.std(unbiased=False)
print(mean.item(),round(std.item(),3))
実行結果平均3.0、標準偏差約2.236

なぜそうなる? 4画素の平均は3です。このコードでは計算のしくみを示すため1枚の例を使いますが、実際に学習へ使う平均と標準偏差は学習用画像全体から求めます。

02 / GO ONE STEP FURTHER

同じ基準で変換する

テスト用画像ごとに平均と標準偏差を求め直さず、学習用画像から決めた値を使います。そうすれば、学習時と評価時に同じ計算を適用できます。

normalized = (image-mean)/std
print(normalized.mean().item())
print(torch.round(normalized*100)/100)
実行結果平均0付近、負と正の値の表

ここに注目 平均を引いて中心を0にします。標準偏差が0に近い場合は、割り算の前に対策が必要です。

03 / YOUR TURN

予想して、理由を話そう

答えを選んで、説明を確かめよう。外れても発見が一つ増えるよ。

テスト画像を正規化するときの平均は?

答えを選ぶと理由が表示されます。

04 / TRY ON COLAB

Colabで試してみよう

コードの実行はColaboratoryの実行環境で行います。まずノートブックを保存し、Colabで「ファイル → ノートブックをアップロード」から開いてください。上から順に実行し、最後に値を変えてみましょう。

保存ボタンを押しても画面は切り替わりません。通常はブラウザの「ダウンロード」フォルダに .ipynb が保存されます。見つからない場合はダウンロード履歴を確認してください。Colabの実習は小さな例から始められます。

COFFEE BREAK

身近な技術とつなげてみよう

AI先生

AI先生:同じ景色でも、カメラや光の当たり方で明るさの数値は変わるよね。学習時と評価時に同じ変換をする理由を考えてみよう。

KEY TERMS

この回の重要な用語

本文で出会った言葉を、ここで意味と一緒に振り返ろう。上の「ことばの窓」からも説明を開けるよ。

平均
値を合計して件数で割った、中心の目安です。
標準偏差
値が平均からどの程度ばらつくかを表す量です。
正規化
ここでは、学習用画像の平均を引き、標準偏差で割って数値を変換することです。