機械学習: TensorFlow 2.0 の 10 のヒント

機械学習: TensorFlow 2.0 の 10 のヒント

この記事では、TensorFlow 2.0 の 10 の機能について説明します。

[[326673]]

1(a). 入力パイプラインを構築するための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], dtype = int32 )

2 つのデータセットを圧縮します。

  1. > > >  データセット0 = tf .data.Dataset.from_tensor_slices([8, 3, 0, 8, 2, 1])
  2. > > >  データセット1 = 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:  形状= (), 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

1(b). イメージデータジェネレータ

これは、tensorflow.keras API の最も優れた機能の 1 つです。 ImageDataGenerator は、バッチ処理と前処理中にデータセットのスライスとデータ拡張をリアルタイムで生成できます。

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

ImageDataGenerator でのデータ拡張に関する誤解の 1 つは、既存のデータセットにさらにデータが追加されるというものです。これはデータ拡張の実際の定義ですが、ImageDataGenerator では、データセット内の画像はトレーニング中のさまざまなステップで動的に変換されるため、モデルはこれまで見たことのないノイズの多いデータでトレーニングできます。

  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 =データフレームからのフロー(
  2. データフレーム、
  3. x_col = 'ファイル名'
  4. y_col = 'クラス'
  5. class_mode = 'カテゴリ'
  6. バッチサイズ= 32  

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

steps_per_epoch パラメータを指定する必要がありますが、実際には number_of_samples // batch_size です。

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

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

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

tf.image API には画像を変換するためのツールがあります。次の Python の例を参照してください。

  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. 視覚化(画像、切り抜き)

3. 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-datasets で利用可能なデータセットの詳細なリストは、ドキュメントのデータセット ページにあります。

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

4. 転移学習に事前学習済みモデルを使用する

転移学習は機械学習の分野における新しいトレンドであり、TensorFlow は、目的のユースケースに合わせて簡単に拡張できる、ベンチマーク済みの事前トレーニング済みモデルを提供します。

  1. ベースモデル= tf .keras.applications.MobileNetV2(
  2. input_shape = IMG_SHAPE
  3. include_top = False
  4. 重み= 'imagenet'  

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

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

tf.keras.applications の下にある他のモデルまたはモジュールの詳細なリストについては、ドキュメント ページを参照してください。

5. 推定値

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

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

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

TensorFlow には、LinearRegressor、BoostedTreesClassifier など、多くの組み込み推定器があります。見積もりもカスタマイズできます。

6. カスタムレイヤー

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

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

カスタム レイヤーを実装する最良の方法は、tf.keras.Layer クラスを拡張することです。

  • __init__ は入力に関係なくすべての初期化を実行できます。
  • ビルドすると、入力テンソルの形状がわかり、残りの初期化を実行できます。
  • 呼び出して、順方向の計算を実行します。

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

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

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

TensorFlow の自動微分化は、勾配を効率的に計算するのに役立ちます。 Python の例は次のとおりです。

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

このサイクルは複数のエポックで繰り返すことができ、ユースケースに応じて他のカスタマイズされた設定を使用することもできます。

8. チェックポイント

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、checkpoint_path、 max_to_keep = 5 )
  6. # モデルの保存
  7. ckpt_manager.save()

チェックポイントをロードします:

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

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

9. ケラスチューナー

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

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

ハイパーパラメータ チューニングは、機械学習モデルの構成を定義するパラメータを選択するプロセスです。これらは、特徴エンジニアリングと機械学習モデルのパフォーマンスを決定する要因です。

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

HyperBand に加えて、BayesianOptimization と RandomSearch もチューニングに使用できます。

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

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

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

10. 分散トレーニング

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

tf.distribute.MirroredStrategy は最もよく使用される戦略です。どのように機能しますか?

  • すべての変数とモデル グラフがレプリカにコピーされます。
  • 入力はレプリカ全体に均等に分散されます。
  • 各レプリカは、受信した入力の損失と勾配を計算します。
  • 勾配は、すべてのレプリカを合計することによって同期されます。
  • 同期後、各レプリカ上の変数のコピーに対して同一の更新が行われます。
  1. 戦略= tf.distribute.MirroredStrategy ()
  2. strategy.scope() を使用する場合:
  3. モデル= tf .keras.Sequential([
  4. tf.keras.layers.Conv2D(
  5. 32, 3、アクティベーション= 'relu' 入力形状= (28, 28, 1)
  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. モデル.コンパイル(
  14. 損失= "sparse_categorical_crossentropy"
  15. オプティマイザー= "adam"
  16. メトリック= ['精度']

やっと

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

<<:  Verdict、2020年第1四半期のTwitterにおけるIoTトレンドトップ5を発表

>>:  GitHub のスター数は 10 万近くに達しています。インド人男性がすべての AI アルゴリズムを Python と Java で実装しました。

ブログ    

推薦する

マイクロソフトのAI研究者が誤って38TBの内部データを漏洩

クラウド セキュリティのスタートアップ企業 Wiz の研究者は、SAS トークンの設定ミスが原因で、...

テレンス・タオが、60 年前のもう一つの幾何学の問題に取り組みます。周期的タイル分割問題における新たなブレークスルー

テレンス・タオ氏が研究してきた周期的モザイク化問題に新たな進歩がありました。 9月18日、Teren...

人工知能は創造的な仕事を促進できるでしょうか?

今日、ほぼすべての AI 作業は機械学習の成功に基づいています。機械学習には分析を検討するための十分...

IDCレポート:ジェネレーティブAIは爆発的な産業探査の時代に入り、技術供給側は商業化の初期段階にある

9月22日、IDCコンサルティングの公式WeChatアカウントによると、2023年下半期以降、ますま...

ヘッドライトから始めて、自動運転はどのようにして攻撃性を排除するのでしょうか?

これは、鞭で打たれるとどんどん速く回転するコマのような「高離職率」社会です。技術推論において非常に重...

手書き認識のための単層基本ニューラルネットワーク

[[214992]]まず、コードテンソルフローをインポートする tensorflow.example...

...

機械学習プログラムで使用される一般的な推奨アルゴリズムの例

推奨アルゴリズムは、機械学習とデータマイニングの分野の重要な部分であり、ユーザーにパーソナライズされ...

...

検索エンジン技術のランキングアルゴリズムを解読する

[[117973]] 1. ページランクPageRank は、世界で最も人気のある検索エンジンである...

...

Googleが4月22日に発表したアルゴリズム改善策の分析

Google の中国ウェブマスター ブログにログインすると、4 月 22 日の午後に更新された「品質...

【専門家がここにいるエピソード3】大量ログ分析とインテリジェントな運用・保守

1. AIOpsとインテリジェントログセンター1.1 AIOps の 5 つのレベルインテリジェント...

...