機械学習: 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 で実装しました。

ブログ    

推薦する

...

SaaS アプリケーションで AI スノーボールはどのように大きくなるのでしょうか?

Shopify の不正防止機械学習から Salesforce の Einstein まで、過去数年...

AI専門家が警告:GPT-3は素晴らしいが透明性に欠ける

[[342733]]アルゴリズムに人間のように書かせることは、人工知能研究機関 OpenAI が長年...

LZ77 圧縮アルゴリズム エンコーディング Python 実装原理図

序文LZ77 アルゴリズムは、1977 年にイスラエルの Abraham Lempel によって公開...

人工知能はデマですか?人工知能が日常生活にもたらす変化を感じられますか?

しかし、メディアで大いに宣伝された後、人々は AlphaGo が Deep Blue と同じレベルに...

このアルゴリズムはアーキテクチャを自動的に最適化し、エンジニアがニューラルネットワークを設計するのに役立ちます。

最近、カナダのバンクーバーで NeurIPS 2019 が開催されました。テンセントAIラボからは合...

小井ロボットの華蔵エコシステムの出現は、大型モデルの商業化の始まりを示しています

10月26日、「人工知能分野での中国初の上場企業」であるXiaoi RobotがHuazang Un...

...

LLM に代わる 2 億パラメータのタイミング モデル? Googleの画期的な研究は「初心者のミス」と批判される

最近、Google の論文が X などのソーシャル メディア プラットフォーム上で論争を巻き起こしま...

AlphaGo の最初のバグ: 囲碁アルゴリズムの最大の弱点は何でしょうか?

[[163852]]どれほど恐ろしいモンスターにも弱点はあります。なぜAlphaGoは皆を驚かせる...

欧州のAI規制案は世界的な影響を及ぼす可能性がある

メディアの報道によると、欧州連合は最近、米国や中国のテクノロジー大手を含む組織を対象に、域内での人工...

InnoDB ストレージ エンジンの 3 つの行ロック アルゴリズムの図解と例の分析

[[415025]]この記事はWeChatの公開アカウント「Flying Veal」から転載したもの...

PageRankアルゴリズムとPR値の転送の詳細な分析

PageRank アルゴリズムは、Google のランキング アルゴリズム (ランキング式) の一部...