チェックポイント
Create machine learning models
/ 15
Use the model
/ 15
Save and Load Models
/ 15
Explore Callbacks
/ 15
Exercise 1
/ 15
Exercise 2
/ 15
Exercise 3
/ 10
TensorFlow を使用したコンピュータ ビジョンの概要
GSP631
概要
TensorFlow は、Google によって開発されたオープンソースの高度な ML ライブラリです。さまざまな環境で利用でき、非常に大きなデータセットを扱うことができます。このラボでは、TensorFlow Vertex AI Workbench を使用して、さまざまな衣料品を認識するコンピュータ ビジョン モデルを作成し、トレーニングします。
TensorFlow の概要
TensorFlow は、ML モデルを構築するための演算フレームワークと、好みの抽象化レベルでモデルを構築できるさまざまなツールキットを提供します。このラボでは、高レベル API の tf.keras を使用して、TensorFlow で画像を分類するためのニューラル ネットワークを構築し、トレーニングします。
ニューラル ネットワーク
ニューラル ネットワークは、人間の脳にヒントを得たモデルです。複数のレイヤで構成され、そのうち少なくとも 1 つが隠れ層となっています。隠れ層は、相互に接続された単純なユニット(ニューロン)と、それに続く非線形性で構成されます。
通常、ニューラル ネットワーク内のノードは、複数の入力値を受け取り、1 つの出力値を生成します。ニューロンは、入力値の加重合計に活性化関数(非線形変換)を適用して、出力値を計算します。
ニューラル ネットワークの詳細については、ニューラル ネットワーク: ノードと隠れ層をご覧ください。
目標
このラボでは、次の方法について学びます。
- Tensorflow モデルの設計、コンパイル、トレーニング、評価
- モデルの保存と読み込み
- 独自のコールバックを書き込むことによるトレーニング時の動作のカスタマイズ
- ネットワークのさまざまなレイヤをテストするための一連の演習の完了
設定と要件
[ラボを開始] ボタンをクリックする前に
こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。
このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
- 標準的なインターネット ブラウザ(Chrome を推奨)
- ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
タスク 1. Vertex AI Workbench でノートブックを開く
-
Google Cloud コンソールのナビゲーション メニューで、[Vertex AI] > [ワークベンチ] をクリックします。
-
インスタンスを見つけて、[JupyterLab を開く] ボタンをクリックします。
Workbench インスタンスの JupyterLab インターフェースが新しいブラウザタブで開きます。
TensorFlow と追加パッケージのインストール
-
ランチャー メニューの [その他] から、[ターミナル] を選択します。
-
ご利用の Python 環境が構成済みかどうかを確認します。ターミナルで次のコマンドをコピーして貼り付けます。
出力例:
- 次のコマンドを実行して TensorFlow パッケージをインストールします。
-
pip3
をアップグレードするには、ターミナルで次のコマンドを実行します。
Pylint は、Python コード内のエラーをチェックし、Python ソースコードの構文およびスタイル上の問題をハイライト表示するツールです。
- 次のコマンドを実行して
pylint
パッケージをインストールします。
-
requirements.txt
ファイルのラボに必要なパッケージをインストールします。
これで環境が設定されました。
タスク 2. 新しいノートブックを作成してライブラリをインポートする
-
ワークベンチの左側にある + アイコンをクリックして、新しいランチャーを開きます。
-
ランチャー メニューの [ノートブック] から、[Python3] を選択します。
新しい Jupyter ノートブックが表示されます。Jupyter ノートブックの使用方法の詳細については、Jupyter Notebook Documentation をご覧ください。
- Cloud Logging の
logging
とgoogle-cloud-logging
をインポートして構成します。最初のセルに次のコードを追加します。
- モデルのトレーニングと評価のために
tensorflow
をインポートします。使いやすいよう、名前をtf
にします。最初のセルに次のコードを追加します。
- デバッグを目的としてデータを解析するため、
numpy
をインポートします。使いやすいよう、名前をnp
にします。最初のセルに次のコードを追加します。
-
tensorflow_datasets
をインポートしてデータセットを統合するため、最初のセルに次のコードを追加します。TensorFlow データセットは、TensorFlow で使用できるデータセットのコレクションです。
-
セルを実行するため、[実行] ボタンをクリックするか、Shift + Enter キーを押します。
-
ノートブックを保存します。[ファイル] > [保存] をクリックします。ファイル名を
model.ipynb
にして、[OK] をクリックします。
タスク 3. データを読み込んで前処理する
データセットについて
Fashion-MNIST というデータセットから衣料品の画像を分類するために、ニューラル ネットワークをトレーニングします。
このデータセットには、10 の衣料品カテゴリに属する 70,000 点の衣料品が含まれています。個々の衣料品を示す、下のような低解像度(28 x 28 ピクセル)の画像があります。
このラボでは、60,000 枚の画像を使用してネットワークをトレーニングし、10,000 枚の画像を使用して学習成果としてのネットワークの画像分類精度を評価します。
Fashion-MNIST データは、TensorFlow データセット(tfd)に含まれています。
データセットの読み込み
Fashion-MNIST データを読み込むには、tfds.load()
関数を使用します。
- ノートブックの 2 つ目のセルに次のコードを追加します。
上のコードで、split
引数を設定して、読み込まれるデータセットのスプリットを指定します。tf.data.Dataset
が 2 タプル構造 (input, label)
になるよう、as_supervised
を True
に設定します。
ds_train と ds_test の型は tf.data.Dataset
です。ds_train には、モデルのトレーニングに使用される 60,000 枚の画像があります。ds_test には、モデルの評価に使用される 10,000 枚の画像があります。
tfds.load()
とその引数の詳細については、ガイドをご覧ください。これらの値はどのようになるでしょうか。
- 次に、print ステートメント追加して、アイテム 0 のトレーニング画像の最小値と最大値を確認します。2 つ目のセルに次のコードを追加します。
データの前処理
-
バッチサイズは ML で使用される用語であり、1 回のイテレーションで使用されるトレーニング サンプルの数を指します。この値を
32
に設定します。
model.ipynb
に以下を追加して、バッチサイズを指定します。
- ニューラル ネットワークのトレーニングは、さまざまな理由により、ピクセル値を 0~1 の範囲にスケーリングすることで簡単になります。このプロセスは「正規化」と呼ばれます。Fashion-MNIST データセットのピクセル値は [0, 255] の範囲内にあるため、ピクセル値を 255.0 で割って画像を正規化します。
以下のコードでは、tf.data.Dataset
の map()
関数を使用して、ds_train
と ds_test
の画像に正規化を適用します。ピクセル値の型は tf.uint8
であるため、tf.cast
関数を使用して tf.float32
に変換し、255.0
で割ります。また、このデータセットは、BATCH_SIZE
を引数として batch()
メソッドを呼び出すことでバッチに変換されます。
tf.data.Dataset
で利用可能なすべてのメソッドの詳細については、こちらをご覧ください。ファイルの末尾に次のコードを追加します。
- もう一度 print ステートメントを使い、トレーニング データセットの画像の最小値と最大値を再確認します。
ファイルの末尾に次のコードを追加します。
タスク 4. モデルを設計、コンパイル、トレーニングする
このセクションでは、TensorFlow を使用してモデルを設計します。
- ファイルに次のコードを追加します。
モデル アーキテクチャで使用されるさまざまな種類のレイヤとパラメータを確認します。
-
Sequential: ニューラル ネットワークのレイヤの順序を定義します。
-
Flatten: 画像の形状が(28, 28)であるため、値の形式が正方行列になります。Flatten は、この正方形を 1 次元ベクトルに変換します。
-
Dense: ニューロンのレイヤを追加します。
ニューロンの各レイヤで、ニューロンを活性化するかどうかを決定するための活性化関数が必要です。多数のオプションがありますが、このラボでは以下が使用されます。
-
ReLu
は、X>0 の場合は X が返され、それ以外の場合は 0 が返されることを実質的に意味します。ネットワークの次のレイヤに、0 以上の値が渡されます。 -
Softmax
では、値のセットが取得され、実質的に最も大きな値が選択されるため、最大値を見つけるための並べ替えが必要ありません。たとえば、前のレイヤの出力が [0.1, 0.1, 0.05, 0.1, 9.5, 0.1, 0.05, 0.05, 0.05] である場合は、[0,0,0,0,1,0,0,0,0] を返します。
モデルのコンパイルとトレーニング
このセクションでは、最初にオプティマイザと損失関数を使用してモデルをコンパイルします。その後、トレーニング データとラベルでモデルをトレーニングします。
目標は、モデルがトレーニング データとそのラベルの関係を理解することです。トレーニングが完了したら、トレーニング・データと類似する衣料品の新しい画像をモデルに提供し、それらの衣料品がどのクラスに属するかついての予測を行わせます。
オプティマイザは、tf.keras モデルをコンパイルするために必要な 2 つの引数の一つです。optimizer
は、重みや学習率などのニューラル ネットワークの属性を変更するアルゴリズムです。損失の削減と精度の向上に役立ちます。
tf.keras
で利用可能なさまざまな種類のオプティマイザの詳細については、こちらをご覧ください。loss
は、モデルのパフォーマンスを数値で表したものです。モデルのパフォーマンスが向上すると、損失の数値は小さくなります。モデルのパフォーマンスが低下すると、数値は大きくなります。
tf.keras
で利用可能なさまざまな種類の損失関数の詳細については、こちらをご覧ください。metrics=
パラメータを確認してください。このパラメータにより、TensorFlow は予測結果を既知の回答(ラベル)と照合して、各エポック後のトレーニングの精度を報告できます。つまり、トレーニングがどれだけ効果的に進行しているかが報告されます。
Model.fit により、指定されたエポック数に達するまでモデルのトレーニングが繰り返されます。
- ファイルに次のコードを追加します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
コードの実行
- [実行] ボタンをクリックするか、Shift + Enter キーを押して 2 つ目のセルを実行します。
ノートブックのセルが実行されると、トレーニングの各エポック(またはパス)の後に、報告された損失と精度の両方が表示されます。エポック(またはパス)ごとに、精度が向上していることを確認してください。
出力例(実際の値は若干異なる可能性がありますが、警告メッセージは無視してください):
# 正規化前の値
の出力で、最小値と最大値が [0, 255]
の範囲内になります。正規化後は、すべての値が [0, 1]
の範囲内になります。
トレーニングが進行すると、損失は減少し、精度は向上します。
モデルのトレーニングが完了すると、最終エポックの末尾に精度値が表示されます。精度は、上の画像の 0.8846 に近い値になると予想されますが、必ずしも一致するとは限りません。
この画像は、ニューラル ネットワークでのトレーニング・データの分類精度が約 89% であることを示しています。つまり、89% の確率で一致する画像とラベルの間のパターン一致が検出されたことになります。これは素晴らしい数字とは言えませんが、ニューラル ネットワークの規模が小さく、トレーニングのエポック数が 5 と少なかったことを考えると悪くはありません。
タスク 5. 未知のデータに対するモデルのパフォーマンスを評価する
では、未知のデータに対するモデルのパフォーマンスはどうなるでしょうか。
テストセットを使用してこの疑問を解決できます。model.evaluate
を呼び出して 2 つのセットを渡すと、それぞれの損失が報告されます。
テストセットの評価:
- ノートブックの 3 つ目のセルに次のコードを追加します。
- [実行] ボタンをクリックするか、Shift + Enter キーを押してこのセルを実行します。
出力の一番下までスクロールすると、最後の行に評価の結果が表示されています。
テストセット(ds_test
)に対するモデルの精度は .8708 となっており、約 87% でした(実際の値は若干異なる可能性があります)。
予想どおり、未知のデータに対するモデルの精度は、トレーニングに使用されたデータに対する精度におよびません。
TensorFlow への理解を深めるなかで、この精度を高める方法を習得できます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
タスク 6. モデルの保存と読み込みを行う
モデルのトレーニング中とトレーニング後に、進行状況を保存できます。つまり、モデルのトレーニングを中断したところから再開でき、トレーニング時間を短縮できます。また、保存したモデルを共有できるため、他のユーザーがそれまでの作業内容を再現できます。この最初の演習では、モデルの保存と読み込みに必要なコードを追加します。
SavedModel
と Keras
)で保存できます。TensorFlow SavedModel
形式が、TF2.x のデフォルト ファイル形式です。ただし、モデルは Keras
形式でも保存できます。2 つのファイル形式でのモデルの保存については、後でより詳しく学習します。- ノートブックの 4 つ目のセルに次のコードを追加します。
上のコードは、モデルを 2 つの異なる形式で保存し、保存したモデルを再度読み込む方法を示しています。ユースケースに応じて任意の形式を選択できます。この機能の詳細については、「モデルの保存と復元」に関する TensorFlow ドキュメントをご覧ください。
- [実行] ボタンをクリックするか、Shift + Enter キーを押してこのセルを実行します。
出力の最後に、2 セットのモデル概要が表示されます。1 つ目は、モデルが SavedModel
形式で保存された後の概要を示しています。2 つ目は、モデルが h5
形式で保存された後の概要を示しています。
実際には同じモデルを 2 つの異なる形式で保存しているため、2 つのモデル概要は同一であることがわかります。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
タスク 7. コールバックを使ってみる
モデルをトレーニングしたときに、トレーニングが進行するにつれてモデルの損失が減少し、精度が向上することを確認しました。望ましいトレーニング精度と損失を達成した後も、場合によってはトレーニングが完了するまで少し待つ必要があります。
「モデルが望ましい精度値に達したら、トレーニングを停止できればいいのに」と思ったかもしれません。
たとえば、精度が 95% で十分であり、3 エポックのモデル トレーニングでその値を達成できた場合、そこから先の多数のエポックが完了するまでなぜ待つ必要があるのでしょうか。
この問題を解決するのがコールバックです。
コールバックは、トレーニング中、評価中、推論中の Keras モデルの動作をカスタマイズするための優れたツールです。モデルがトレーニング セットで望ましい精度に達すると同時にトレーニングを停止するよう、コールバックを定義できます。
次のコードを試して、精度が 84% に達したらトレーニングを停止するコールバックを設定するとどうなるかを確認してみましょう。
-
ランチャーを開き、[Python3] を選択して、新しい Jupiter ノートブックを作成します。
-
ファイルを
callback_model.ipynb
という名前で保存します。 -
callback_model.ipynb
の最初のセルに次のコードを貼り付けます。
-
Ctrl + S キーを押すか、[ファイル] > [ノートブックを保存] に移動して変更を保存します。
-
[実行] ボタンをクリックするか、Shift + Enter キーを押してコードを実行します。
少数のエポックの後、トレーニングがキャンセルされたことを確認します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
タスク 8. モデルをテストする
このセクションでは、ネットワークの複数のレイヤをテストします。
演習 1
この演習では、モデルのレイヤを調査します。ニューロンの数を変更したらどうなるでしょうか。
-
ランチャーを開き、[Python3] を選択して、新しい Jupiter ノートブックを作成します。
-
ファイルを
updated_model.ipynb
という名前で保存します。 -
updated_model.ipynb
の最初のセルに次のコードを貼り付けます。
- dense レイヤの異なる値をテストします。
# モデルを定義
セクションに移動して、ニューロンの数を 64 から 128 に変更します。
-
Ctrl + S キーを押すか、[ファイル] > [ノートブックを保存] に移動して変更を保存します。
-
[実行] ボタンをクリックするか、Shift + Enter キーを押してコードを実行します。
損失やトレーニング時間などの結果はどのように変化したでしょうか。そして、なぜこうなると思いますか。
ニューロンの数を 128 に増やすと、より多くの計算を実行する必要があるため、トレーニング・プロセスにかかる時間が長くなります。このケースでは、数を増やしたことでモデルの精度が向上したため、プラスの効果がありました。しかし、必ずしも数を増やせばよいというものではありません。すぐに収穫逓減の法則に陥る可能性があります。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
演習 2
ネットワークのレイヤを追加した場合の効果を考えてみましょう。2 つの dense レイヤの間に別のレイヤを追加するとどうなるでしょうか。
-
updated_model.ipynb
で、# モデルを定義
セクションにレイヤを追加します。
モデル定義を以下で置き換えます。
-
Ctrl + S キーを押すか、[ファイル] > [ノートブックを保存] に移動して変更を保存します。
-
[実行] ボタンをクリックするか、Shift + Enter キーを押してコードを実行します。
答え: 大きな影響はありません。データが比較的シンプルであるためです。これよりはるかに複雑なデータでは、追加のレイヤが必要になることが多いです。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
演習 3
モデルをトレーニングする前に、ピクセル値を [0, 1]
の範囲に正規化しました。正規化前のデータセットのように、値が [0, 255] の範囲内になるよう正規化を解除したらどうなるでしょうか。
- 試してみましょう。
# データを定義、読み込み、構成
で、トレーニング データセットとテスト データセットの両方に適用された map 関数を削除します。
- このコードをセルの末尾に追加して、最初の画像の最大値をバッチ 0 でプリントします。正規化なしでは、最大値が
[0, 255]
の範囲内になります。
-
updated_model.ipynb
は、最終的に次のようになります。
-
Ctrl + S キーを押すか、[ファイル] > [ノートブックを保存] に移動して変更を保存します。
-
[実行] ボタンをクリックするか、Shift + Enter キーを押してコードを実行します。
# 最大値をプリントして変更を確認
の予想される出力
エポックの完了後に、正規化を行わない場合の精度の違いを確認できます。
なぜ精度が変化すると思いますか。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
演習 4
Flatten()
レイヤを削除するとどうなるでしょう。そしてなぜそうなるのでしょうか。
試してみましょう。
-
# モデルを定義
セクションで、tf.keras.layers.Flatten()
を削除します。
- 保存して、
updated_model.ipynb
でセルを実行します。
データの形状に関するエラーが表示されます。これは予期された状況です。
エラーの詳細は現時点ではあいまいに思われるかもしれませんが、ネットワークの最初のレイヤとデータの形状は同じであるべきという経験則を裏付けるものです。現在、入力画像の形状は 28 x 28 ですが、28 ニューロンの 28 レイヤは実現不可能です。そのため、この 28,28 を 784x1 にフラット化するのが理にかなっています。
これを処理するコードをすべて自分で書き込むのではなく、最初に Flatten()
レイヤを追加できます。後でモデルに読み込まれた配列は、自動的にフラット化されます。
演習 5
最後の(出力)レイヤを確認します。最後のレイヤのニューロン数が 10 なのはなぜでしょう。10 以外の数だったらどうなるでしょうか。
ニューロン数 5 でネットワークをトレーニングして、確かめてみましょう。
-
# モデルを定義
セクションを以下で置き換えて、前のセクションで行った変更を取り消します。
- 最後のレイヤのニューロン数を 10 から 5 に変更します。
- 保存して、
updated_model.ipynb
でセルを実行します。
結果: 予期しない値が見つかると同時に、エラーが表示されます。
経験則によると、最後のレイヤのニューロン数は、分類するクラスの数と一致する必要があります。このケースでは、クラスは 0 から 9 までの 10 個あるため、最後のレイヤのニューロン数は 10 になるべきです。
お疲れさまでした
これで完了です。このラボでは、Tensorflow モデルを設計、コンパイル、トレーニング、評価する方法を学びました。また、モデルの保存と読み込みの方法や、独自のコールバックを書き込んでトレーニング時の動作をカスタマイズする方法も学びました。さらに、ネットワークのさまざまなレイヤをテストするための一連の演習を完了しました。
次のステップと詳細情報
- 機械学習集中講座で知っておくべきことをすべて確認します。
- 試してみるで、コンピュータ ビジョンでできることを楽しみながら覚えます。
- Vertex AI の一部としての ML について確認します。Vertex AI のドキュメントをご覧ください。
- AI で楽しみましょう。Google で実験をご覧ください。
- TensorFlow の詳細を確認します。
Google Cloud トレーニングと認定資格
Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。
マニュアルの最終更新日: 2024 年 9 月 12 日
ラボの最終テスト日: 2024 年 9 月 12 日
Copyright 2024 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。