機械学習に必須: TensorFlow を使用するための 11 のヒント

機械学習に必須: TensorFlow を使用するための 11 のヒント

[[326623]]

TensorFlow 2.x は、モデルの構築と全体的な使用において多くの利便性を提供します。それで、tf の新機能は何ですか?

  • Keras を使用した簡単なモデル構築。
  • あらゆるプラットフォームでの本番環境における堅牢なモデル展開。
  • 強力な研究実験。
  • 廃止されたAPIをクリーンアップすることでさまざまな手順を簡素化

この記事では、TensorFlow API の一部である関数/クラスにより、TensorFlow の使用がスムーズになり、コード行数が削減され、効率が向上する TF 2.0 の 10 の機能について説明します。

1. 入力パイプラインを構築するためのtf.data API

tf.data API は、データ パイプラインと関連操作の機能を提供します。 パイプラインの構築、前処理関数のマッピング、データセットのシャッフルやバッチ処理などを行うことができます。

テンソルを使用したパイプラインの構築

  1. >>> データセット = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ])
  2. >>> iter(データセット).next().numpy()
  3. 8

データセットのシャッフルとバッチ処理

  1. # シャッフル
  2. >>> データセット = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ]).shuffle( 6 )
  3. >>> iter(データセット).next().numpy()
  4. 0
  5. # バッチ
  6. >>> データセット = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ]).batch( 2 )
  7. >>> iter(データセット).next().numpy()
  8. 配列([ 8 , 3 ], dtype=int32)
  9. # シャッフルとバッチ
  10. >>> データセット = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ]).shuffle( 6 ).batch( 2 )
  11. >>> iter(データセット).next().numpy()
  12. 配列([ 3 , 0 ], データ型=int32)

2つのデータセットを圧縮する

  1. >>> dataset0 = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ])
  2. >>> dataset1 = tf.data.Dataset.from_tensor_slices([ 1 , 2 , 3 , 4 , 5 , 6 ])
  3. >>> データセット = tf.data.Dataset.zip((データセット0, データセット1))
  4. >>> iter(データセット).next()
  5. (<tf.Tensor: shape=(), dtype=int32, numpy= 8 >、<tf.Tensor: shape=(), dtype=int32, numpy= 1 >)

外部関数のマッピング

  1. def into_2(数値):
  2. 数値 * 2を返す
  3. >>> データセット = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ]).map(into_2)
  4. >>> iter(データセット).next().numpy()
  5. 16

2. 画像データジェネレータ

これは、tensorflow.keras API の最も優れた機能の 1 つです (私の意見では)。画像データジェネレーターは、バッチ処理と前処理中にデータセットのスライスを生成し、リアルタイムでデータ拡張を実行できます。

ジェネレーターを使用すると、ディレクトリまたはデータフレームから直接データをストリーミングできます。

画像データジェネレーターにおけるデータ拡張に関する誤解は、既存のデータセットにさらにデータを追加するというものです。これはデータ拡張の実際の定義ですが、画像データジェネレーターでは、データセット内の画像はトレーニング プロセス中のさまざまなステップでオンザフライで変換されるため、モデルはこれまで見たことのないノイズの多いデータでトレーニングできます。

  1. train_datagen = イメージデータジェネレータ(
  2. 再スケール = 1 ./ 255
  3. せん断範囲 = 0.2
  4. ズーム範囲 = 0.2
  5. 水平反転=True

ここでは、すべてのサンプルが(正規化のために)再スケーリングされ、他のパラメータは拡張のために使用されます。

  1. train_generator = train_datagen.flow_from_directory(
  2. 'データ/トレーニング'
  3. ターゲットサイズ=( 150 , 150 ),
  4. バッチサイズ = 32
  5. class_mode = 'バイナリ'

リアルタイム データ ストリームのディレクトリを指定します。これは、データフレームを使用して行うこともできます。

  1. train_generator = flow_from_dataframe(
  2. データフレーム、
  3. x_col = 'ファイル名'
  4. y_col = 'クラス'
  5. class_mode = 'カテゴリ'
  6. バッチサイズ = 32

x_col パラメータは画像への完全なパスを定義し、y_col パラメータは分類のラベル列を定義します。

このモデルは発電機で直接電力を供給することができます。 steps_per_epoch パラメータを指定する必要がありますが、実際にはサンプル数/バッチ サイズになります。

  1. モデル.フィット(
  2. 列車ジェネレータ、
  3. 検証データ=val_generator、
  4. エポック=EPOCHS、
  5. steps_per_epoch = (num_samples // batch_size)、
  6. validation_steps=(num_val_samples // batch_size)

3. tf.image を使用したデータ拡張

データの拡張が必要です。データが不十分な場合は、データを変更して個別のデータ ポイントとして扱うことが、より少ないデータでトレーニングを行う非常に効果的な方法です。

tf.image API には画像を変換するためのツールがあり、これは後で前述の tf.data API を介してデータ拡張に使用できます。

  1. 反転 = tf.image.flip_left_right(画像)
  2. 視覚化する(画像、反転)

上記のコードの出力は次のようになります。

  1. 飽和 = tf.image.adjust_saturation(画像、 5 )
  2. 視覚化する(画像、飽和)

上記のコードの出力は次のようになります。

  1. 回転 = tf.image.rot90(画像)
  2. 視覚化(画像、回転)

上記のコードの出力は次のようになります。

  1. 切り取られた画像 = tf.image.central_crop(画像、central_fraction= 0.5 )
  2. 視覚化(画像、切り抜き)

上記のコードの出力は次のようになります。

4.TensorFlowデータセット

  1. pip で tensorflow-datasets をインストールします

これは、Tensorflow によって収集されたさまざまなドメインからの非常によく知られたデータセットをダンプするための唯一の出発点であるため、非常に便利なライブラリです。

  1. tensorflow_datasets を tfds としてインポートする
  2. mnist_data = tfds.load( "mnist" )
  3. mnist_train、mnist_test = mnist_data[ "train" ]、mnist_data[ "test" ]
  4. isinstance(mnist_train、tf.data.Dataset)をアサートする

Tensorflow データセットは次のリンクにあります。

https://www.tensorflow.org/datasets/catalog/overview

オーディオ、画像、画像分類、オブジェクト検出、構造化、要約、テキスト、翻訳、ビデオは、tfds によって提供されるタイプです。

5. 事前学習済みモデルに基づく転移学習

転移学習は機械学習における新たなホットなトピックです。ベースライン モデルがすでに他の誰かによってトレーニングされている場合、そのモデルはもはや適用可能でも実用的でもありません。転移学習は、事前トレーニング済みのモデルを特定のユースケースに再利用したり、異なるユースケースに拡張したりすることでこの問題を解決します。

TensorFlow は、目的のユースケースに簡単に拡張できるベースラインの事前トレーニング済みモデルを提供します。

  1. ベースモデル = tf.keras.applications.MobileNetV2(
  2. 入力シェイプ=IMG_SHAPE、
  3. include_top=False、
  4. 重み = 'imagenet'

この base_model は、追加のレイヤーや異なるモデルを使用して簡単に拡張できます。次に例を示します。

  1. モデル = tf.keras.Sequential([
  2. ベースモデル、
  3. グローバル平均レイヤー、
  4. 予測レイヤー
  5. ])

6. 見積もり

推定器は TensorFlow の完全なモデルの高レベル表現であり、簡単にスケーリングして非同期的にトレーニングできるように設計されています - TensorFlow ドキュメント

事前に作成された推定器は非常に高レベルのモデル抽象化を提供するため、低レベルの複雑さを気にすることなく、モデルのトレーニングに直接集中できます。 例えば:

  1. 線形推定 = tf.estimator.線形分類器(
  2. 機能列=機能列
  3. 線形推定のトレーニング(train_input_fn)
  4. 結果 = linear_est.evaluate(eval_input_fn)

これは、tf.estimator を使用して推定器を構築およびトレーニングするのが非常に簡単であり、推定器をカスタマイズすることもできることを示しています。

TensorFlow には、LinearRegressor、BoostedTreesClassifier など、事前に作成された推定器が多数あります。詳細については、Tensorflow のドキュメントをご覧ください。

7. カスタムレイヤー

ニューラル ネットワークは、さまざまな種類の層を持つ多層のネットワークとしてよく知られています。 TensorFlow には、多くの定義済みレイヤー (Dense、LSTM など) が含まれています。 しかし、より複雑なアーキテクチャの場合、レイヤーのロジックはメイン レイヤーよりもはるかに複雑になります。 このような場合、TensorFlow ではカスタム レイヤーを構築できます。 これは、tf.keras.layers.Layer クラスをサブクラス化することで実行できます。

  1. クラスCustomDense(tf.keras.layers.Layer):
  2. def __init__(self, num_outputs):
  3. スーパー(CustomDense、self).__init__()
  4. 自己.num_outputs = num_outputs
  5. def build(self, input_shape):
  6. 自己.カーネル = 自己.重みを追加します(
  7. 「カーネル」
  8. 形状 = [ int (input_shape[- 1 ]),
  9. 自己.num_outputs]
  10. def call(self, 入力):
  11. tf.matmul(入力、self.kernel)を返します

ドキュメントに記載されているように、独自のレイヤーを実装する最良の方法は、tf.keras.Layer クラスを拡張して以下を実装することです。

  • __init__ は、入力に依存しないすべての初期化を実行する場所です。
  • 構築。入力テンソルの形状がわかっており、残りの初期化を実行できます。
  • 呼び出して、前方計算を実行できます。

カーネルの初期化は __init__ 自体で実行できますが、ビルドで実行した方がよいでしょう。そうしないと、新しいレイヤーを作成するたびに input_shape を明示的に指定する必要があります。

8. カスタマイズされたトレーニング

tf.keras シーケンスおよびモデル API を使用すると、モデルのトレーニングが容易になります。 ただし、複雑なモデルをトレーニングする場合は、ほとんどの場合、カスタム損失関数が使用されます。 さらに、モデルのトレーニングはデフォルトのトレーニングとは異なる場合があります (たとえば、異なるモデル コンポーネントに個別に勾配を適用するなど)。

TensorFlow の自動微分化は、勾配を効率的に計算するのに役立ち、これらのプリミティブはカスタム トレーニング ループを定義するために使用されます。

  1. def train(モデル、入力、出力、学習率):
  2. tf.GradientTape() を t として使用します:
  3. # モデル予測からの損失の計算
  4. current_loss = loss(出力、モデル(入力))
  5. # 得られた損失を持つ訓練可能な変数勾配
  6. dW, db = t.gradient(current_loss, [model.W, model.b])
  7. # 重みにグラデーションを適用する
  8. モデル.W.assign_sub(学習率 * dW)
  9. model.b.assign_sub(学習率 * db)

このサイクルは、ユースケースに応じてよりカスタマイズされた設定で、複数の期間にわたって繰り返すことができます。

9. チェックポイント

TensorFlow モデルの保存には 2 つの方法があります。

  • SavedModel: モデルの完全な状態とすべてのパラメータを保存します。 これはソースコードとは関係ありません。
  1. model.save_weights( 'チェックポイント' )
  • チェックポイント

チェックポイントは、モデルで使用されるすべてのパラメータの正確な値をキャプチャします。 Sequential API または Model API を使用して構築されたモデルは、SavedModel 形式で簡単に保存できます。

ただし、カスタム モデルの場合はチェックポイントが必要です。

チェックポイントには、モデルによって定義された計算の説明は含まれていないため、通常は、保存されたパラメータ値を使用するソース コードが利用可能な場合にのみ役立ちます。

チェックポイントを保存

  1. checkpoint_path = "save_path"
  2. # チェックポイントの定義
  3. ckpt = tf.train.Checkpoint(モデル = モデル、オプティマイザ = オプティマイザ)
  4. # CheckpointManager オブジェクトの作成
  5. ckpt_manager = tf.train.CheckpointManager(ckpt、チェックポイントパス、max_to_keep= 5 )
  6. # モデルの保存
  7. ckpt_manager.save()

チェックポイントからロード

TensorFlow は、ロードされたオブジェクトから開始して、名前付きエッジを持つ有向グラフをトラバースすることにより、変数をチェックポイント値に一致させます。

ドキュメントを介したモデル回復のための依存関係グラフ

  1. ckpt_manager.latest_checkpointの場合:
  2. ckpt.restore(ckpt_manager.latest_checkpoint)

10. ケラスチューナー

これは TensorFlow のかなり新しい機能です。

  1. !pip keras-tuner をインストールします

ハイパーパラメータチューニング (ハイパーチューニング) は、ML モデルの構成を定義するパラメータを選択するプロセスです。これらの要素は、特徴エンジニアリングと前処理後のモデルのパフォーマンスを決定づけるものです。

  1. # model_builderはモデルを構築して返す関数です
  2. チューナー = kt.Hyperband(
  3. モデルビルダー、
  4. 目標 = 'val_accuracy'
  5. 最大エポック = 10
  6. 係数 = 3
  7. ディレクトリ = 'my_dir'
  8. プロジェクト名 = 'intro_to_kt'

ハイパーランドに加えて、ベイジアン最適化とランダムサーチもチューニングに使用できます。

  1. チューナー.検索(
  2. 画像_train、ラベル_train、
  3. エポック = 10
  4. 検証データ=(画像テスト、ラベルテスト)、
  5. コールバック=[ClearTrainingOutput()]
  6. # 最適なハイパーパラメータを取得する
  7. best_hps = チューナー.get_best_hyperparameters(num_trials= 1 )[ 0 ]

さらに、最適なハイパーパラメータを使用してモデルをトレーニングします。

  1. モデル = tuner.hypermodel.build(best_hps)
  2. モデル.フィット(
  3. 画像_列車、
  4. ラベル_トレイン、
  5. エポック = 10
  6. 検証データ=(画像テスト、ラベルテスト)

11. 分散トレーニング

複数の GPU があり、トレーニング ループを複数の GPU に分散してトレーニングを最適化したい場合は、TensorFlow のさまざまな分散トレーニング戦略によって GPU の使用を最適化し、GPU でのトレーニングを処理できます。

MirroredStrategy は最も一般的に使用される戦略です。どのように機能しますか?

  1. すべての変数とモデル グラフがレプリカにコピーされます。
  2. 入力はレプリカ間で均等に分散されます。
  3. 各レプリカは、受信した入力の損失と勾配を計算します。
  4. これらの勾配は、すべてのレプリカを合計することによって同期されます。
  5. 同期後、各レプリカ上の変数のコピーに対して同一の更新が行われます。
  1. 戦略 = tf.distribute.MirroredStrategy()
  2. strategy.scope() を使用する場合:
  3. モデル = tf.keras.Sequential([
  4. tf.keras.layers.Conv2D(
  5. 323 、活性化= 'relu' 、入力形状=( 28281 )
  6. )、
  7. tf.keras.layers.MaxPooling2D()、
  8. tf.keras.layers.Flatten()、
  9. tf.keras.layers.Dense( 64 、アクティベーション= 'relu' )、
  10. tf.keras.layers.dense( 10 ) の構文
  11. ])
  12. モデル.コンパイル(
  13. 損失 = "sparse_categorical_crossentropy"
  14. オプティマイザー = "adam"
  15. メトリック=[ '精度' ]

要約する

TensorFlow は、機械学習のすべてのコンポーネントを構築するのに十分な強力さを備えています。 このチュートリアルの主な内容は、TensorFlow が提供するさまざまな API の紹介と、それらの使用方法に関するクイック ガイドです。

Git コード アドレス: https://github.com/rojagtap/tensorflow_tutorials

<<:  機械学習の仕組み

>>:  インテリジェントな音声対話サービスはますます良くなり、従順であることも芸術である

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

ディープフェイク動画が急速に広まっている。ブロックチェーンがこの「疫病」を阻止できるかもしれない

「フェイクニュース」という言葉が今話題になっているが、ディープフェイク(本物に見えるが実は偽の動画を...

...

ザッカーバーグはオープンソース AGI に全力を注ぐ: Llama 3 をトレーニング、35 万台の H100 を年末までに提供開始

ザッカーバーグ氏は新たな目標「すべてをオープンソースの AGI に」を発表しました。そう、ザッカーバ...

...

...

10億ピクセル画像のマルチスケール特性評価のためのスタンフォード大学の新しいニューラルシーン表現方法がSIGGRAPHに選出されました

現在、ニューラル表現は、レンダリング、イメージング、幾何学モデリング、シミュレーション アプリケーシ...

人工知能は若者を失業させるでしょうか? 996に圧倒されないでください。そうしないとチャンスがなくなります。

教育部が2019年3月に発表した新規登録学部専攻を例にとると、最も人気のある専攻は人工知能です。上海...

人工知能学習: 人工ニューラル ネットワークとは何ですか?

[51CTO.com クイック翻訳] 多くの人工知能コンピュータシステムの中核技術は、人間の脳の生...

バブルソートに加えて、Python の組み込みソートアルゴリズムをご存知ですか?

プログラミング アルゴリズムに関して、多くの読者が学校で最初に学ぶのはバブル ソートかもしれませんが...

GIF 圧縮アルゴリズムの発明者が IEEE の最高栄誉賞を受賞

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

初心者のための CNN と Keras のクイックガイド

[[201203]] 1. Keras を使用する理由ディープラーニングが大人気の昨今、サードパーテ...

...

IEEE テクノロジー分野賞発表: ML パイオニアがリストに、中国本土から受賞した唯一の学者は清華大学の学生

[[409353]] IEEE が再び栄誉を授与する時が来ました。 7月2日、米国電気電子学会(IE...

人工知能はインターネットなしでも動作できるようになる

エッジコンピューティングの進歩とますます高性能化するチップにより、人工知能(AI)は広域ネットワーク...

IBM LinkedIn が教えてくれる: 職場と AI はどれくらい離れているのか?

[51CTO.com からのオリジナル記事] 少し前に、LinkedIn と IBM が多数の専門...