アルゴリズム実践者が知っておくべき TensorFlow のヒント 10 選

アルゴリズム実践者が知っておくべき TensorFlow のヒント 10 選

導入

これらを習得することで、モデルをより効率的にして開発効率を向上させることができます。

[[343415]]

TensorFlow 2.x は、モデルの構築と TensorFlow の全体的な使用を大幅に簡素化します。 TF2 の新機能は何でしょうか?

  • Keras を使用してモデルを簡単に構築し、即座に実行します。
  • あらゆるプラットフォームでの強力なモデル展開。
  • 強力な研究実験。
  • 古くなった API をクリーンアップし、重複を減らすことで API を簡素化します。

この記事では、TensorFlow での作業をスムーズにし、コード行数を減らし、効率を高める TF 2.0 の 10 の機能について説明します。

1(a). tf.dataは入力パイプラインを構築する

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

テンソルからパイプラインを構築する

  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() 0
  4. # バッチ>>> dataset = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ]).batch( 2 )
  5. >>> iter(データセット).next().numpy()配列([ 8 , 3 ], dtype=int32)
  6. # シャッフルとバッチ処理>>> dataset = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ]).shuffle( 6 ).batch( 2 )
  7. >>> iter(データセット).next().numpy()配列([ 3 , 0 ], dtype=int32)

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

  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

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

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

ジェネレータを使用してモデルに直接データを供給できます。 steps_per_epochパラメータ ( number_of_samples // batch_size) を指定する必要があります。

  1. モデル.フィット(
  2. train_generator、validation_data=val_generator、epochs=EPOCHS、steps_per_epoch=(num_samples // batch_size)、
  3. validation_steps=(num_val_samples // batch_size)

2. データの強化にはtf.imageを使用する

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

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

  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. アサートインスタンス(mnist_train、tf.data.Dataset)

tensorflow-datasets で利用可能なデータセットの詳細なリストについては、https://www.tensorflow.org/datasets/catalog/overview を参照してください。

tfds が提供するデータセットの種類には、オーディオ、画像、画像分類、オブジェクト検出、構造化データ、サマリー、テキスト、翻訳、ビデオなどがあります。

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

転移学習は機械学習における新しい、非常に重要な技術です。ベースライン モデルがすでに他の誰かによってトレーニングされており、そのトレーニングに大量のリソース (たとえば、1 人の人間では購入できない可能性のある複数の高価な GPU) が必要な場合。転移学習はこの問題を解決します。事前トレーニング済みのモデルは、特定のシナリオで再利用したり、さまざまなシナリオに拡張したりできます。

TensorFlow は、必要なシナリオに合わせて簡単に拡張できるベースラインの事前トレーニング済みモデルを提供します。

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

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

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

5. 推定値

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

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

  1. 線形推定 = tf.estimator.線形分類器(
  2. feature_columns = feature_columns) linear_est.train(train_input_fn) 結果 = linear_est.evaluate(eval_input_fn)

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

TensorFlow には、LinearRegressor、BoostedTreesClassifier など、多くの推定器があります。

6. カスタムレイヤー

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

  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, input):
  11. tf.matmul(入力、self.kernel)を返します

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

  1. _init_ は、入力とは関係のないすべての初期化を実行できる場所です。
  2. build では、入力テンソルの形状がわかっており、残りの初期化作業を実行できます。
  3. call 、ここで順方向の計算が実行されます。

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

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

tf.keras Sequential および Model 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)

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

8. チェックポイント

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

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

チェックポイントは、モデルで使用されるすべてのパラメータの値をキャプチャします。 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)

9. ケラスチューナー

これは 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'  

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

  1. チューナー.検索(
  2. img_train、label_train、epochs = 10 、validation_data = (img_test、label_test)、callbacks = [ClearTrainingOutput()]) # 最適なハイパーパラメータを取得する
  3. best_hps = チューナー.get_best_hyperparameters(num_trials= 1 )[ 0 ]

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

  1. モデル = tuner.hypermodel.build(best_hps)
  2. model.fit( img_train, label_train, エポック= 10 ,
  3. 検証データ=(画像テスト、ラベルテスト))

10. 分散トレーニング

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

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

  • すべての変数とモデル グラフが複製されます。
  • 入力はレプリカ全体に均等に分散されます。
  • 各レプリカは、受信した入力の損失と勾配を計算します。
  • すべての同期レプリカの勾配が合計されます。
  • 同期後、各レプリカの変数に対して同一の更新が行われます。
  1. strategy = tf.distribute.MirroredStrategy() と strategy.scope():
  2. モデル = tf.keras.Sequential([ tf.keras.layers.Conv2D( 32 , 3 , activation= 'relu' , input_shape=( 28 , 28 , 1 )
  3. )、tf.keras.layers.MaxPooling2D()、tf.keras.layers.Flatten()、tf.keras.layers.Dense( 64 、アクティベーション = 'relu' )、
  4. tf.keras.layers.dense( 10 )の構文
  5. ]) model.compile( loss = "sparse_categorical_crossentropy" ,
  6. オプティマイザー = "adam"
  7. メトリック=[ '精度' ]

<<:  パラメータ調整器、ここを見てください!ディープラーニングのトレーニング効率を向上させる2つのコツ

>>:  2021 年のデジタル トランスフォーメーションの 10 大トレンド

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

推薦する

AIプロジェクトの失敗はもはや人材不足のせいにはされない

AI の取り組みが失敗すると、その責任はスキルのギャップにあるとされることが多いです。しかし、それだ...

人工知能は広告に関して私たちを誤解させている。今こそ誤りを正すべき時だ

社会が急速に変化する時代において、ブランドセーフティ戦略は分裂を招き、保護対象であるブランド評判その...

クアルコムがSnapdragon 845の機能を発表:より高速で、より電力効率が高く、AIパフォーマンスが2倍に

12月6日ハワイ時間、クアルコムは第2回Snapdragonテクノロジーサミットで、新型Snapdr...

Java プログラミング スキル - データ構造とアルゴリズム「再帰」

[[392763]]コンセプト簡単に言うと、再帰とは、毎回異なる変数を渡しながら、自身を呼び出すメ...

屋台経済は活況を呈している!ロボットも問題を抱えている

「働いてお金を稼ぐのは大変すぎるから、屋台を出して自分で経営者になったほうがいいよ!」露店経済の突然...

...

ドローンは思考によって制御される新しい方法を経験しており、その商業的展望は非常に刺激的です。

近年、ドローン業界は非常に急速な発展を遂げていると言えます。製品面では数量が大幅に増加し、種類もます...

SAP、データスフィアプラットフォームを強化する新たな生成AI機能を発表

SAP は、生成 AI 向けの多数の新機能を発表しており、まもなく SAP Datasphere プ...

SASは、IoTイニシアチブにAIを組み込むことで企業が競合他社を飛び越えることができると述べている

SAS の新しいレポート「AIoT – IoT リーダーが困難を脱する方法」によると、組織のモノのイ...

13Bモデルはあらゆる面でGPT-4を圧倒しますか?この裏にあるトリックは何でしょうか?

130 億のパラメータを持つモデルが実際にトップの GPT-4 に勝つのでしょうか?下の図に示すよ...

日本生命保険は6年間にわたりRPAを導入し、1万人の従業員の2,000万時間以上の工数を節約した。

日本生命保険株式会社(以下、日本生命)は、日本最大級の保険会社の一つであり、世界60カ国以上で事業を...

...

コンピュータビジョンプロジェクトのためのオブジェクト検出の初心者向けガイド

[51CTO.com クイック翻訳]近年、人工知能技術の発展と進歩に伴い、コンピュータービジョンとデ...