arrow_back

TensorFlow を使用したコンピュータ ビジョンの概要

ログイン 参加
知識をテストして、コミュニティで共有しましょう
done
700 を超えるハンズオンラボ、スキルバッジ、コースへのアクセス

TensorFlow を使用したコンピュータ ビジョンの概要

ラボ 1時間 universal_currency_alt クレジット: 5 show_chart 中級
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
知識をテストして、コミュニティで共有しましょう
done
700 を超えるハンズオンラボ、スキルバッジ、コースへのアクセス

GSP631

Google Cloud セルフペース ラボ

概要

TensorFlow は、Google によって開発されたオープンソースの高度な ML ライブラリです。さまざまな環境で利用でき、非常に大きなデータセットを扱うことができます。このラボでは、TensorFlow Vertex AI Workbench を使用して、さまざまな衣料品を認識するコンピュータ ビジョン モデルを作成し、トレーニングします。

TensorFlow の概要

TensorFlow は、ML モデルを構築するための演算フレームワークと、好みの抽象化レベルでモデルを構築できるさまざまなツールキットを提供します。このラボでは、高レベル API の tf.keras を使用して、TensorFlow で画像を分類するためのニューラル ネットワークを構築し、トレーニングします。

ニューラル ネットワーク

ニューラル ネットワークは、人間の脳にヒントを得たモデルです。複数のレイヤで構成され、そのうち少なくとも 1 つが隠れ層となっています。隠れ層は、相互に接続された単純なユニット(ニューロン)と、それに続く非線形性で構成されます。

通常、ニューラル ネットワーク内のノードは、複数の入力値を受け取り、1 つの出力値を生成します。ニューロンは、入力値の加重合計に活性化関数(非線形変換)を適用して、出力値を計算します。

ニューラル ネットワークの詳細については、ニューラル ネットワーク: ノードと隠れ層をご覧ください。

目標

このラボでは、次の方法について学びます。

  • Tensorflow モデルの設計、コンパイル、トレーニング、評価
  • モデルの保存と読み込み
  • 独自のコールバックを書き込むことによるトレーニング時の動作のカスタマイズ
  • ネットワークのさまざまなレイヤをテストするための一連の演習の完了

設定と要件

[ラボを開始] ボタンをクリックする前に

こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。

このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。
  • ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、このラボでは使用しないでください。アカウントへの追加料金が発生する可能性があります。

タスク 1. Vertex AI Workbench でノートブックを開く

  1. Google Cloud コンソールのナビゲーション メニューで、[Vertex AI] > [ワークベンチ] をクリックします。

  2. インスタンスを見つけて、[JupyterLab を開く] ボタンをクリックします。

Workbench インスタンスの JupyterLab インターフェースが新しいブラウザタブで開きます。

TensorFlow と追加パッケージのインストール

  1. ランチャー メニューの [その他] から、[ターミナル] を選択します。

  2. ご利用の Python 環境が構成済みかどうかを確認します。ターミナルで次のコマンドをコピーして貼り付けます。

python --version

出力例:

Python 3.10.14
  1. 次のコマンドを実行して TensorFlow パッケージをインストールします。
pip3 install tensorflow
  1. pip3 をアップグレードするには、ターミナルで次のコマンドを実行します。
pip3 install --upgrade pip

Pylint は、Python コード内のエラーをチェックし、Python ソースコードの構文およびスタイル上の問題をハイライト表示するツールです。

  1. 次のコマンドを実行して pylint パッケージをインストールします。
pip install -U pylint --user
  1. requirements.txt ファイルのラボに必要なパッケージをインストールします。
pip install -r requirements.txt

これで環境が設定されました。

タスク 2. 新しいノートブックを作成してライブラリをインポートする

  1. ワークベンチの左側にある + アイコンをクリックして、新しいランチャーを開きます。

  2. ランチャー メニューの [ノートブック] から、[Python3] を選択します。

新しいノートブック ファイル

新しい Jupyter ノートブックが表示されます。Jupyter ノートブックの使用方法の詳細については、Jupyter Notebook Documentation をご覧ください。

  1. Cloud Logging の logginggoogle-cloud-logging をインポートして構成します。最初のセルに次のコードを追加します。
# ロギングをインポートおよび構成 import logging import google.cloud.logging as cloud_logging from google.cloud.logging.handlers import CloudLoggingHandler from google.cloud.logging_v2.handlers import setup_logging cloud_logger = logging.getLogger('cloudLogger') cloud_logger.setLevel(logging.INFO) cloud_logger.addHandler(CloudLoggingHandler(cloud_logging.Client())) cloud_logger.addHandler(logging.StreamHandler())
  1. モデルのトレーニングと評価のために tensorflow をインポートします。使いやすいよう、名前を tf にします。最初のセルに次のコードを追加します。
# TensorFlow をインポート import tensorflow as tf
  1. デバッグを目的としてデータを解析するため、numpy をインポートします。使いやすいよう、名前を np にします。最初のセルに次のコードを追加します。
# numpy をインポート import numpy as np
  1. tensorflow_datasets をインポートしてデータセットを統合するため、最初のセルに次のコードを追加します。TensorFlow データセットは、TensorFlow で使用できるデータセットのコレクションです。
使用方法の詳細については、ガイドデータセットのリストをご覧ください。 # tensorflow_datasets をインポート import tensorflow_datasets as tfds
  1. セルを実行するため、[実行] ボタンをクリックするか、Shift + Enter キーを押します。

  2. ノートブックを保存します。[ファイル] > [保存] をクリックします。ファイル名を model.ipynb にして、[OK] をクリックします。

タスク 3. データを読み込んで前処理する

データセットについて

Fashion-MNIST というデータセットから衣料品の画像を分類するために、ニューラル ネットワークをトレーニングします。

このデータセットには、10 の衣料品カテゴリに属する 70,000 点の衣料品が含まれています。個々の衣料品を示す、下のような低解像度(28 x 28 ピクセル)の画像があります。

2c4b51c68ec17b3b.png

このラボでは、60,000 枚の画像を使用してネットワークをトレーニングし、10,000 枚の画像を使用して学習成果としてのネットワークの画像分類精度を評価します。

Fashion-MNIST データは、TensorFlow データセット(tfd)に含まれています。

データセットの読み込み

Fashion-MNIST データを読み込むには、tfds.load() 関数を使用します。

  1. ノートブックの 2 つ目のセルに次のコードを追加します。
# データを定義、読み込み、構成 (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True)

上のコードで、split 引数を設定して、読み込まれるデータセットのスプリットを指定します。tf.data.Dataset が 2 タプル構造 (input, label) になるよう、as_supervisedTrue に設定します。

ds_trainds_test の型は tf.data.Dataset です。ds_train には、モデルのトレーニングに使用される 60,000 枚の画像があります。ds_test には、モデルの評価に使用される 10,000 枚の画像があります。

tfds.load() とその引数の詳細については、ガイドをご覧ください。

これらの値はどのようになるでしょうか。

  1. 次に、print ステートメント追加して、アイテム 0 のトレーニング画像の最小値と最大値を確認します。2 つ目のセルに次のコードを追加します。
# 正規化前の値 image_batch, labels_batch = next(iter(ds_train)) print("Before normalization ->", np.min(image_batch[0]), np.max(image_batch[0]))

データの前処理

  1. バッチサイズは ML で使用される用語であり、1 回のイテレーションで使用されるトレーニング サンプルの数を指します。この値を 32 に設定します。

model.ipynb に以下を追加して、バッチサイズを指定します。

# バッチサイズを定義 BATCH_SIZE = 32
  1. ニューラル ネットワークのトレーニングは、さまざまな理由により、ピクセル値を 0~1 の範囲にスケーリングすることで簡単になります。このプロセスは「正規化」と呼ばれます。Fashion-MNIST データセットのピクセル値は [0, 255] の範囲内にあるため、ピクセル値を 255.0 で割って画像を正規化します。

以下のコードでは、tf.data.Datasetmap() 関数を使用して、ds_trainds_test の画像に正規化を適用します。ピクセル値の型は tf.uint8 であるため、tf.cast 関数を使用して tf.float32 に変換し、255.0 で割ります。また、このデータセットは、BATCH_SIZE を引数として batch() メソッドを呼び出すことでバッチに変換されます。

tf.data.Dataset で利用可能なすべてのメソッドの詳細については、こちらをご覧ください。

ファイルの末尾に次のコードを追加します。

# データセットの正規化およびバッチ処理 ds_train = ds_train.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) ds_test = ds_test.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE)
  1. もう一度 print ステートメントを使い、トレーニング データセットの画像の最小値と最大値を再確認します。

ファイルの末尾に次のコードを追加します。

# 正規化後のバッチの最小値と最大値を検証 image_batch, labels_batch = next(iter(ds_train)) print("After normalization ->", np.min(image_batch[0]), np.max(image_batch[0]))

タスク 4. モデルを設計、コンパイル、トレーニングする

このセクションでは、TensorFlow を使用してモデルを設計します。

  1. ファイルに次のコードを追加します。
# モデルを定義 model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])

モデル アーキテクチャで使用されるさまざまな種類のレイヤとパラメータを確認します。

  • 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 は予測結果を既知の回答(ラベル)と照合して、各エポック後のトレーニングの精度を報告できます。つまり、トレーニングがどれだけ効果的に進行しているかが報告されます。

「tf.keras」で利用可能なさまざまな種類の指標について詳しくは、こちらをクリックしてください。

Model.fit により、指定されたエポック数に達するまでモデルのトレーニングが繰り返されます。

  1. ファイルに次のコードを追加します。
# モデルをコンパイル model.compile(optimizer = tf.keras.optimizers.Adam(), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) model.fit(ds_train, epochs=5)

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 ML モデルを作成する

コードの実行

  1. [実行] ボタンをクリックするか、Shift + Enter キーを押して 2 つ目のセルを実行します。

ノートブックのセルが実行されると、トレーニングの各エポック(またはパス)の後に、報告された損失と精度の両方が表示されます。エポック(またはパス)ごとに、精度が向上していることを確認してください。

出力例(実際の値は若干異なる可能性がありますが、警告メッセージは無視してください):

Before normalization -> 0 227 After normalization -> 0.0 1.0 Epoch 1/5 1875/1875 [==============================] - 12s 6ms/step - loss: 0.5264 - sparse_categorical_accuracy: 0.8175 Epoch 2/5 1875/1875 [==============================] - 6s 3ms/step - loss: 0.3977 - sparse_categorical_accuracy: 0.8580 Epoch 3/5 1875/1875 [==============================] - 5s 3ms/step - loss: 0.3585 - sparse_categorical_accuracy: 0.8701 Epoch 4/5 1875/1875 [==============================] - 5s 2ms/step - loss: 0.3329 - sparse_categorical_accuracy: 0.8784 Epoch 5/5 1875/1875 [==============================] - 5s 2ms/step - loss: 0.3151 - sparse_categorical_accuracy: 0.8846

# 正規化前の値の出力で、最小値と最大値が [0, 255] の範囲内になります。正規化後は、すべての値が [0, 1] の範囲内になります。

トレーニングが進行すると、損失は減少し、精度は向上します。

モデルのトレーニングが完了すると、最終エポックの末尾に精度値が表示されます。精度は、上の画像の 0.8846 に近い値になると予想されますが、必ずしも一致するとは限りません。

この画像は、ニューラル ネットワークでのトレーニング・データの分類精度が約 89% であることを示しています。つまり、89% の確率で一致する画像とラベルの間のパターン一致が検出されたことになります。これは素晴らしい数字とは言えませんが、ニューラル ネットワークの規模が小さく、トレーニングのエポック数が 5 と少なかったことを考えると悪くはありません。

タスク 5. 未知のデータに対するモデルのパフォーマンスを評価する

では、未知のデータに対するモデルのパフォーマンスはどうなるでしょうか。

テストセットを使用してこの疑問を解決できます。model.evaluate を呼び出して 2 つのセットを渡すと、それぞれの損失が報告されます。

テストセットの評価:

  1. ノートブックの 3 つ目のセルに次のコードを追加します。
cloud_logger.info(model.evaluate(ds_test))
  1. [実行] ボタンをクリックするか、Shift + Enter キーを押してこのセルを実行します。

出力の一番下までスクロールすると、最後の行に評価の結果が表示されています。

Before normalization -> 0 227 After normalization -> 0.0 1.0 Epoch 1/5 1875/1875 [==============================] - 12s 6ms/step - loss: 0.5264 - sparse_categorical_accuracy: 0.8175 Epoch 2/5 1875/1875 [==============================] - 6s 3ms/step - loss: 0.3977 - sparse_categorical_accuracy: 0.8580 Epoch 3/5 1875/1875 [==============================] - 5s 3ms/step - loss: 0.3585 - sparse_categorical_accuracy: 0.8701 Epoch 4/5 1875/1875 [==============================] - 5s 2ms/step - loss: 0.3329 - sparse_categorical_accuracy: 0.8784 Epoch 5/5 1875/1875 [==============================] - 5s 2ms/step - loss: 0.3151 - sparse_categorical_accuracy: 0.8846 313/313 [==============================] - 1s 4ms/step - loss: 0.3653 - sparse_categorical_accuracy: 0.8708 INFO:cloudLogger:[0.36530008912086487, 0.8708000183105469]

テストセット(ds_test)に対するモデルの精度は .8708 となっており、約 87% でした(実際の値は若干異なる可能性があります)。

予想どおり、未知のデータに対するモデルの精度は、トレーニングに使用されたデータに対する精度におよびません。

TensorFlow への理解を深めるなかで、この精度を高める方法を習得できます。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 モデルを使用する

タスク 6. モデルの保存と読み込みを行う

モデルのトレーニング中とトレーニング後に、進行状況を保存できます。つまり、モデルのトレーニングを中断したところから再開でき、トレーニング時間を短縮できます。また、保存したモデルを共有できるため、他のユーザーがそれまでの作業内容を再現できます。この最初の演習では、モデルの保存と読み込みに必要なコードを追加します。

モデル全体を 2 つの異なるファイル形式(SavedModelKeras)で保存できます。TensorFlow SavedModel 形式が、TF2.x のデフォルト ファイル形式です。ただし、モデルは Keras 形式でも保存できます。2 つのファイル形式でのモデルの保存については、後でより詳しく学習します。
  1. ノートブックの 4 つ目のセルに次のコードを追加します。
# モデル全体を SavedModel として保存します。 model.save('saved_model') # 新しい Keras モデルを保存済みモデルから再読み込み new_model = tf.keras.models.load_model('saved_model') # ロードされた SavedModel の概要 new_model.summary() # モデル全体を keras ファイルに保存します。 model.save('my_model.keras') # 重みとオプティマイザを含め、完全に同じモデルを再作成 new_model_keras = tf.keras.models.load_model('my_model.keras') # 読み込まれた keras モデルの概要 new_model_keras.summary()

上のコードは、モデルを 2 つの異なる形式で保存し、保存したモデルを再度読み込む方法を示しています。ユースケースに応じて任意の形式を選択できます。この機能の詳細については、「モデルの保存と復元」に関する TensorFlow ドキュメントをご覧ください。

  1. [実行] ボタンをクリックするか、Shift + Enter キーを押してこのセルを実行します。

出力の最後に、2 セットのモデル概要が表示されます。1 つ目は、モデルが SavedModel 形式で保存された後の概要を示しています。2 つ目は、モデルが h5 形式で保存された後の概要を示しています。

実際には同じモデルを 2 つの異なる形式で保存しているため、2 つのモデル概要は同一であることがわかります。

Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 dense (Dense) (None, 64) 50240 dense_1 (Dense) (None, 10) 650 ================================================================= Total params: 50,890 Trainable params: 50,890 Non-trainable params: 0 _________________________________________________________________ Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 dense (Dense) (None, 64) 50240 dense_1 (Dense) (None, 10) 650 ================================================================= Total params: 50,890 Trainable params: 50,890 Non-trainable params: 0 _________________________________________________________________

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 モデルの保存と読み込みを行う

タスク 7. コールバックを使ってみる

モデルをトレーニングしたときに、トレーニングが進行するにつれてモデルの損失が減少し、精度が向上することを確認しました。望ましいトレーニング精度と損失を達成した後も、場合によってはトレーニングが完了するまで少し待つ必要があります。

「モデルが望ましい精度値に達したら、トレーニングを停止できればいいのに」と思ったかもしれません。

たとえば、精度が 95% で十分であり、3 エポックのモデル トレーニングでその値を達成できた場合、そこから先の多数のエポックが完了するまでなぜ待つ必要があるのでしょうか。

この問題を解決するのがコールバックです。

コールバックは、トレーニング中、評価中、推論中の Keras モデルの動作をカスタマイズするための優れたツールです。モデルがトレーニング セットで望ましい精度に達すると同時にトレーニングを停止するよう、コールバックを定義できます。

次のコードを試して、精度が 84% に達したらトレーニングを停止するコールバックを設定するとどうなるかを確認してみましょう。

  1. ランチャーを開き、[Python3] を選択して、新しい Jupiter ノートブックを作成します。

  2. ファイルを callback_model.ipynb という名前で保存します。

  3. callback_model.ipynb の最初のセルに次のコードを貼り付けます。

# ロギングをインポートおよび構成 import logging import google.cloud.logging as cloud_logging from google.cloud.logging.handlers import CloudLoggingHandler from google.cloud.logging_v2.handlers import setup_logging exp_logger = logging.getLogger('expLogger') exp_logger.setLevel(logging.INFO) exp_logger.addHandler(CloudLoggingHandler(cloud_logging.Client(), name="callback")) # tensorflow_datasets をインポート import tensorflow_datasets as tfds # numpy をインポート import numpy as np # TensorFlow をインポート import tensorflow as tf # コールバックを定義 class myCallback(tf.keras.callbacks.Callback): def on_epoch_end(self, epoch, logs={}): if(logs.get('sparse_categorical_accuracy')>0.84): exp_logger.info("\nReached 84% accuracy so cancelling training!") self.model.stop_training = True callbacks = myCallback() # データを定義、読み込み、構成 (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True) # バッチサイズを定義 BATCH_SIZE = 32 # データの正規化とバッチ処理 ds_train = ds_train.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) ds_test = ds_test.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) # モデルを定義 model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)]) # データをコンパイル model.compile(optimizer = tf.keras.optimizers.Adam(), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) model.fit(ds_train, epochs=5, callbacks=[callbacks])
  1. Ctrl + S キーを押すか、[ファイル] > [ノートブックを保存] に移動して変更を保存します。

  2. [実行] ボタンをクリックするか、Shift + Enter キーを押してコードを実行します。

少数のエポックの後、トレーニングがキャンセルされたことを確認します。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 コールバックを使ってみる

タスク 8. モデルをテストする

このセクションでは、ネットワークの複数のレイヤをテストします。

演習 1

この演習では、モデルのレイヤを調査します。ニューロンの数を変更したらどうなるでしょうか。

  1. ランチャーを開き、[Python3] を選択して、新しい Jupiter ノートブックを作成します。

  2. ファイルを updated_model.ipynb という名前で保存します。

  3. updated_model.ipynb の最初のセルに次のコードを貼り付けます。

# ロギングをインポートおよび構成 import logging import google.cloud.logging as cloud_logging from google.cloud.logging.handlers import CloudLoggingHandler from google.cloud.logging_v2.handlers import setup_logging up_logger = logging.getLogger('upLogger') up_logger.setLevel(logging.INFO) up_logger.addHandler(CloudLoggingHandler(cloud_logging.Client(), name="updated")) # tensorflow_datasets をインポート import tensorflow_datasets as tfds # numpy をインポート import numpy as np # TensorFlow をインポート import tensorflow as tf # データを定義、読み込み、構成 (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True) # バッチサイズを定義 BATCH_SIZE = 32 # データの正規化とバッチ処理 ds_train = ds_train.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) ds_test = ds_test.map(lambda x, y: (tf.cast(x, tf.float32)/255.0, y)).batch(BATCH_SIZE) # モデルを定義 model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)]) # データをコンパイル model.compile(optimizer = tf.keras.optimizers.Adam(), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) model.fit(ds_train, epochs=5) # モデル概要をロギング model.summary(print_fn=up_logger.info)
  1. dense レイヤの異なる値をテストします。

# モデルを定義セクションに移動して、ニューロンの数を 64 から 128 に変更します。

# モデルを定義 model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. Ctrl + S キーを押すか、[ファイル] > [ノートブックを保存] に移動して変更を保存します。

  2. [実行] ボタンをクリックするか、Shift + Enter キーを押してコードを実行します。

損失やトレーニング時間などの結果はどのように変化したでしょうか。そして、なぜこうなると思いますか。

ニューロンの数を 128 に増やすと、より多くの計算を実行する必要があるため、トレーニング・プロセスにかかる時間が長くなります。このケースでは、数を増やしたことでモデルの精度が向上したため、プラスの効果がありました。しかし、必ずしも数を増やせばよいというものではありません。すぐに収穫逓減の法則に陥る可能性があります。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 演習 1

演習 2

ネットワークのレイヤを追加した場合の効果を考えてみましょう。2 つの dense レイヤの間に別のレイヤを追加するとどうなるでしょうか。

  1. updated_model.ipynb で、# モデルを定義セクションにレイヤを追加します。

モデル定義を以下で置き換えます。

# モデルを定義 model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. Ctrl + S キーを押すか、[ファイル] > [ノートブックを保存] に移動して変更を保存します。

  2. [実行] ボタンをクリックするか、Shift + Enter キーを押してコードを実行します。

答え: 大きな影響はありません。データが比較的シンプルであるためです。これよりはるかに複雑なデータでは、追加のレイヤが必要になることが多いです。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 演習 2

演習 3

モデルをトレーニングする前に、ピクセル値を [0, 1] の範囲に正規化しました。正規化前のデータセットのように、値が [0, 255] の範囲内になるよう正規化を解除したらどうなるでしょうか。

  1. 試してみましょう。# データを定義、読み込み、構成で、トレーニング データセットとテスト データセットの両方に適用された map 関数を削除します。
# データを定義、読み込み、構成 (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True) # バッチサイズを定義 BATCH_SIZE = 32 # データの正規化とバッチ処理 ds_train = ds_train.batch(BATCH_SIZE) ds_test = ds_test.batch(BATCH_SIZE) # モデルを定義 model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. このコードをセルの末尾に追加して、最初の画像の最大値をバッチ 0 でプリントします。正規化なしでは、最大値が [0, 255] の範囲内になります。
# 最大値をプリントして変更を確認 image_batch, labels_batch = next(iter(ds_train)) t_image_batch, t_labels_batch = next(iter(ds_test)) up_logger.info("training images max " + str(np.max(image_batch[0]))) up_logger.info("test images max " + str(np.max(t_image_batch[0])))
  1. updated_model.ipynb は、最終的に次のようになります。
# ロギングをインポートおよび構成 import logging import google.cloud.logging as cloud_logging from google.cloud.logging.handlers import CloudLoggingHandler from google.cloud.logging_v2.handlers import setup_logging up_logger = logging.getLogger('upLogger') up_logger.setLevel(logging.INFO) up_logger.addHandler(CloudLoggingHandler(cloud_logging.Client(), name="updated")) # tensorflow_datasets をインポート import tensorflow_datasets as tfds # numpy をインポート import numpy as np # TensorFlow をインポート import tensorflow as tf # データを定義、読み込み、構成 (ds_train, ds_test), info = tfds.load('fashion_mnist', split=['train', 'test'], with_info=True, as_supervised=True) # バッチサイズを定義 BATCH_SIZE = 32 # データの正規化とバッチ処理 ds_train = ds_train.batch(BATCH_SIZE) ds_test = ds_test.batch(BATCH_SIZE) # モデルを定義 model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)]) # データをコンパイル model.compile(optimizer = tf.keras.optimizers.Adam(), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()]) model.fit(ds_train, epochs=5) # モデル概要をロギング model.summary(print_fn=up_logger.info) # 最大値をプリントして変更を確認 image_batch, labels_batch = next(iter(ds_train)) t_image_batch, t_labels_batch = next(iter(ds_test)) up_logger.info("training images max " + str(np.max(image_batch[0]))) up_logger.info("test images max " + str(np.max(t_image_batch[0])))
  1. Ctrl + S キーを押すか、[ファイル] > [ノートブックを保存] に移動して変更を保存します。

  2. [実行] ボタンをクリックするか、Shift + Enter キーを押してコードを実行します。

# 最大値をプリントして変更を確認の予想される出力

INFO:upLogger:training images max 255 INFO:upLogger:test images max 255

エポックの完了後に、正規化を行わない場合の精度の違いを確認できます。

なぜ精度が変化すると思いますか。

Stack Overflow でその答えが明確に示されています。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 演習 3

演習 4

Flatten() レイヤを削除するとどうなるでしょう。そしてなぜそうなるのでしょうか。

試してみましょう。

  1. # モデルを定義セクションで、tf.keras.layers.Flatten() を削除します。
# モデルを定義 model = tf.keras.models.Sequential([tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. 保存して、updated_model.ipynb でセルを実行します。

データの形状に関するエラーが表示されます。これは予期された状況です。

エラーの詳細は現時点ではあいまいに思われるかもしれませんが、ネットワークの最初のレイヤとデータの形状は同じであるべきという経験則を裏付けるものです。現在、入力画像の形状は 28 x 28 ですが、28 ニューロンの 28 レイヤは実現不可能です。そのため、この 28,28 を 784x1 にフラット化するのが理にかなっています。

これを処理するコードをすべて自分で書き込むのではなく、最初に Flatten() レイヤを追加できます。後でモデルに読み込まれた配列は、自動的にフラット化されます。

演習 5

最後の(出力)レイヤを確認します。最後のレイヤのニューロン数が 10 なのはなぜでしょう。10 以外の数だったらどうなるでしょうか。

ニューロン数 5 でネットワークをトレーニングして、確かめてみましょう。

  1. # モデルを定義セクションを以下で置き換えて、前のセクションで行った変更を取り消します。
# モデルを定義 model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
  1. 最後のレイヤのニューロン数を 10 から 5 に変更します。
# モデルを定義 model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(5, activation=tf.nn.softmax)])
  1. 保存して、updated_model.ipynb でセルを実行します。

結果: 予期しない値が見つかると同時に、エラーが表示されます。

経験則によると、最後のレイヤのニューロン数は、分類するクラスの数と一致する必要があります。このケースでは、クラスは 0 から 9 までの 10 個あるため、最後のレイヤのニューロン数は 10 になるべきです。

お疲れさまでした

これで完了です。このラボでは、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 の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします