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

ブログ    

推薦する

.NET8 究極のパフォーマンス最適化 プリミティブ - DateTime

序文前回の記事では列挙型の最適化について説明しました。今回は時刻形式である DateTime の最適...

新しいヘルスケアソリューション: ヘルスケアにおける AI と IoT が認知症患者をどのように支援できるか

年齢を重ねるにつれて、私たちの体はさまざまな病気や障害に悩まされるようになります。それはまるで逆方向...

Nervana Technology の深掘り: Neon を使用したエンドツーエンドの音声認識の実装方法

音声は本質的に即時の信号です。音声で伝えられる情報要素は、複数の時間スケールで進化します。空気圧の影...

年次レビュー: 2017 年の「愚かな」 AI 製品 8 つ

2017年は「人工知能実装元年」と言われています。 AIは人々の生活の隅々にまで浸透しており、AIハ...

製造業におけるデジタルツインについて知っておくべきことすべて

インテリジェント製造の分野では、AI 駆動型デジタルツインが重要な技術となっています。デジタル ツイ...

AIは英語のエッセイを添削できますか? IELTS、CET-4、CET-6の採点、コメント、エラー修正が必要です

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

...

Testin Cloud Testingは、ビッグモデル+ソフトウェアテストの業界リーダーの技術革新の道を模索し始めました。

情報技術が急速に発展する時代において、ソフトウェア業界は活況を呈しており、高品質のソフトウェアに対す...

...

...

...

...

2019年にロボット分野で注目すべき5つのトレンド

2019 年に注目すべき 5 つのロボット トレンドは次のとおりです。 [[259551]] 1. ...

VB.NET コーディングアルゴリズム学習ノート

この記事では、VB.NET コーディング アルゴリズムを紹介します。おそらく、まだ多くの人が VB....

...