導入これらを習得することで、モデルをより効率的にして開発効率を向上させることができます。 [[343415]] TensorFlow 2.x は、モデルの構築と TensorFlow の全体的な使用を大幅に簡素化します。 TF2 の新機能は何でしょうか? - Keras を使用してモデルを簡単に構築し、即座に実行します。
- あらゆるプラットフォームでの強力なモデル展開。
- 強力な研究実験。
- 古くなった API をクリーンアップし、重複を減らすことで API を簡素化します。
この記事では、TensorFlow での作業をスムーズにし、コード行数を減らし、効率を高める TF 2.0 の 10 の機能について説明します。 1(a). tf.dataは入力パイプラインを構築するtf.data は、データ パイプラインと関連操作のための関数を提供します。パイプラインの構築、前処理関数のマッピング、データセットのシャッフルやバッチ処理などを行うことができます。 テンソルからパイプラインを構築する- >>> データセット = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ])
- >>> iter(データセット).next().numpy()
- 8
バッチの構築とシャッフル- # シャッフル
- >>> データセット = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ]).shuffle( 6 )
- >>> iter(データセット).next().numpy() 0
- # バッチ>>> dataset = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ]).batch( 2 )
- >>> iter(データセット).next().numpy()配列([ 8 , 3 ], dtype=int32)
- # シャッフルとバッチ処理>>> dataset = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ]).shuffle( 6 ).batch( 2 )
- >>> iter(データセット).next().numpy()配列([ 3 , 0 ], dtype=int32)
2つのデータセットを1つに圧縮する- >>> dataset0 = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ])
- >>> dataset1 = tf.data.Dataset.from_tensor_slices([ 1 , 2 , 3 , 4 , 5 , 6 ])
- >>> データセット = tf.data.Dataset.zip((データセット0, データセット1))
- >>> iter(データセット).next()
- (<tf.Tensor: shape=(), dtype=int32, numpy= 8 >、<tf.Tensor: shape=(), dtype=int32, numpy= 1 >)
外部関数のマッピング- def into_2(数値):
- 数値 * 2を返す
- >>> データセット = tf.data.Dataset.from_tensor_slices([ 8 , 3 , 0 , 8 , 2 , 1 ]).map(into_2)
- >>> iter(データセット).next().numpy()
- 16
1(b). イメージデータジェネレータこれは、tensorflow.keras API の最も優れた機能の 1 つです。 ImageDataGenerator は、バッチ処理、前処理、およびデータ拡張を行いながら、データセットのスライスをリアルタイムで生成できます。 ジェネレーターを使用すると、ディレクトリまたはデータ ディレクトリから直接データ ストリームを生成できます。 ImageDataGenerator でのデータ拡張に関する誤解の 1 つは、既存のデータセットにさらにデータが追加されるというものです。これはデータ拡張の実際の定義ですが、ImageDataGenerator では、データセット内の画像はトレーニングのさまざまなステップで動的に変換され、モデルを目に見えないノイズの多いデータでトレーニングできるようになります。
- train_datagen = イメージデータジェネレータ(
- 再スケール = 1 ./ 255 、
- せん断範囲 = 0.2 、
- ズーム範囲 = 0.2 、
- 水平反転=True
- )
ここでは、すべてのサンプルが(正規化のために)再スケーリングされ、他のパラメータは拡張のために使用されます。 - train_generator = train_datagen.flow_from_directory(
- 'データ/トレーニング' 、
- ターゲットサイズ=( 150 , 150 ),
- バッチサイズ = 32 、
- class_mode = 'バイナリ'
- )
リアルタイム データ ストリームのディレクトリを指定します。これはデータフレームを使用して実行することもできます。 - train_generator = flow_from_dataframe(
- データフレーム、x_col= 'ファイル名' 、
- y_col = 'クラス' 、
- class_mode = 'カテゴリ' 、
- バッチサイズ = 32
- )
x_colパラメータは画像への完全なパスを定義し、 y_colパラメータは分類のラベル列を定義します。 ジェネレータを使用してモデルに直接データを供給できます。 steps_per_epochパラメータ ( number_of_samples // batch_size) を指定する必要があります。 - モデル.フィット(
- train_generator、validation_data=val_generator、epochs=EPOCHS、steps_per_epoch=(num_samples
- validation_steps=(num_val_samples
- )
2. データの強化にはtf.imageを使用するデータの拡張が必要です。データが不足している場合、データを変更して個別のデータ ポイントとして扱うことは、より少ないデータでトレーニングを行う非常に効果的な方法です。 tf.image API には画像を変換するためのツールがあり、これを tf.data を使用したデータ拡張に使用できます。 - 反転 = tf.image.flip_left_right(画像)
- 視覚化する(画像、反転)
上記コードの出力 - 飽和 = tf.image.adjust_saturation(画像、 5 )
- 視覚化する(画像、飽和)
上記コードの出力 - 回転 = tf.image.rot90(画像)
- 視覚化(画像、回転)
上記コードの出力 - 切り取られた画像 = tf.image.central_crop(画像、central_fraction= 0.5 )
- 視覚化(画像、切り抜き)
上記コードの出力 3. TensorFlowデータセット- pip で tensorflow-datasets をインストールします
これは、TensorFlow によってさまざまな分野から収集された非常に有名なデータセットが含まれているため、非常に便利なライブラリです。 - tensorflow_datasets を tfds としてインポートする
- mnist_data = tfds.load( "mnist" )
- mnist_train、mnist_test = mnist_data[ "train" ]、mnist_data[ "test" ]
- アサートインスタンス(mnist_train、tf.data.Dataset)
tensorflow-datasets で利用可能なデータセットの詳細なリストについては、https://www.tensorflow.org/datasets/catalog/overview を参照してください。 tfds が提供するデータセットの種類には、オーディオ、画像、画像分類、オブジェクト検出、構造化データ、サマリー、テキスト、翻訳、ビデオなどがあります。
4. 転移学習に事前学習済みモデルを使用する転移学習は機械学習における新しい、非常に重要な技術です。ベースライン モデルがすでに他の誰かによってトレーニングされており、そのトレーニングに大量のリソース (たとえば、1 人の人間では購入できない可能性のある複数の高価な GPU) が必要な場合。転移学習はこの問題を解決します。事前トレーニング済みのモデルは、特定のシナリオで再利用したり、さまざまなシナリオに拡張したりできます。 TensorFlow は、必要なシナリオに合わせて簡単に拡張できるベースラインの事前トレーニング済みモデルを提供します。 - ベースモデル = tf.keras.applications.MobileNetV2(
- input_shape=IMG_SHAPE、include_top=False、
- 重み = 'imagenet'
- )
このbase_model は、追加のレイヤーや異なるモデルを使用して簡単に拡張できます。のように: - モデル = tf.keras.Sequential([
- ベースモデル、グローバル平均レイヤー、予測レイヤー])
5. 推定値推定器は、TensorFlow の完全なモデルの高レベル表現であり、簡単にスケーラブルで非同期的にトレーニングできるように設計されています。
事前に作成された推定器は非常に高レベルのモデル抽象化を提供するため、基礎となる複雑さを気にすることなく、モデルのトレーニングに直接集中できます。例えば: - 線形推定 = tf.estimator.線形分類器(
- 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 をサブクラス化することで実現できます。 - クラスCustomDense(tf.keras.layers.Layer):
- def __init__(self, num_outputs):
- スーパー(CustomDense、self).__init__()
- 自己.num_outputs = num_outputs
- def build(self, input_shape):
- 自己.カーネル = 自己.重みを追加します(
- 「カーネル」 、
- 形状 = [ int (input_shape[- 1 ]),
- 自己.num_outputs]
- ) def call(self, input):
- tf.matmul(入力、self.kernel)を返します。
ドキュメントに記載されているように、独自のレイヤーを実装する最良の方法は、tf.keras.Layer クラスを拡張して以下を実装することです。 - _init_ は、入力とは関係のないすべての初期化を実行できる場所です。
- build では、入力テンソルの形状がわかっており、残りの初期化作業を実行できます。
- call 、ここで順方向の計算が実行されます。
カーネルの初期化は *_ init _ で実行できますが、ビルドで実行した方がよいでしょう。そうしないと、新しいレイヤーを作成するたびに input_shape * を明示的に指定する必要があります。 7. カスタマイズされたトレーニングtf.keras Sequential および Model API により、モデルのトレーニングが容易になります。ただし、複雑なモデルをトレーニングする場合は、ほとんどの場合、カスタム損失関数が使用されます。さらに、モデルのトレーニングもデフォルトのトレーニングとは異なる場合があります (たとえば、異なるモデル コンポーネントの勾配を個別に評価するなど)。 TensorFlow の自動微分化は、勾配を効率的に計算するのに役立ちます。これらのプリミティブは、カスタム トレーニング ループを定義するために使用されます。 - def train(モデル、入力、出力、学習率):
- tf.GradientTape() を t として使用します:
- # モデル予測からの損失の計算
- current_loss = loss(出力、モデル(入力))
- # 得られた損失を持つ訓練可能な変数の勾配
- dW, db = t.gradient(current_loss, [model.W, model.b])
- # 重みにグラデーションを適用する
- モデル.W.assign_sub(学習率 * dW)
- model.b.assign_sub(学習率 * db)
このサイクルは、ユースケースに応じて、複数のエポックで、よりカスタマイズされた設定で繰り返すことができます。 8. チェックポイントTensorFlow モデルを保存するには 2 つの方法があります。 - SavedModel : すべてのパラメータとともにモデルの完全な状態を保存します。これはソースコードとは無関係です。 model.save_weights('チェックポイント')
- チェックポイント
チェックポイントは、モデルで使用されるすべてのパラメータの値をキャプチャします。 Sequential API または Model API を使用して構築されたモデルは、SavedModel 形式で簡単に保存できます。 ただし、カスタム モデルの場合はチェックポイントが必要です。 チェックポイントにはモデルによって定義された計算の説明は含まれていないため、保存されたパラメータ値は通常、ソース コードが利用可能な場合にのみ役立ちます。
チェックポイントを保存- checkpoint_path = "save_path"
- # チェックポイントの定義
- ckpt = tf.train.Checkpoint(モデル = モデル、オプティマイザ = オプティマイザ)
- # CheckpointManager オブジェクトの作成
- ckpt_manager = tf.train.CheckpointManager(ckpt、チェックポイントパス、max_to_keep= 5 )
- # モデルの保存
- ckpt_manager.save()
チェックポイントからモデルをロードするTensorFlow は、読み込まれたオブジェクトから開始し、名前付きエッジを持つ有向グラフをトラバースして、変数をチェックポイント値に一致させます。 - ckpt_manager.latest_checkpointの場合:
- ckpt.restore(ckpt_manager.latest_checkpoint)
9. ケラスチューナーこれは TensorFlow のかなり新しい機能です。 - !pip keras-tuner をインストールします
ハイパーパラメータのチューニング チューニングは、定義された ML モデル構成のパラメータをスクリーニングするプロセスです。特徴エンジニアリングと前処理の後、これらの要素がモデルのパフォーマンスを決定します。 - # model_builderはモデルを構築して返す関数です
- チューナー = kt.Hyperband(
- モデルビルダー、
- 目標 = 'val_accuracy' 、
- 最大エポック = 10 、
- 係数 = 3 、
- ディレクトリ = 'my_dir' 、
- プロジェクト名 = 'intro_to_kt'
- )
HyperBand に加えて、BayesianOptimization と RandomSearch もチューニングに使用できます。 - チューナー.検索(
- img_train、label_train、epochs = 10 、validation_data = (img_test、label_test)、callbacks = [ClearTrainingOutput()]) # 最適なハイパーパラメータを取得する
- best_hps = チューナー.get_best_hyperparameters(num_trials= 1 )[ 0 ]
次に、最適なハイパーパラメータを使用してモデルをトレーニングします。 - モデル = tuner.hypermodel.build(best_hps)
- model.fit( img_train, label_train, エポック= 10 ,
- 検証データ=(画像テスト、ラベルテスト))
10. 分散トレーニング複数の GPU があり、トレーニング ループを複数の GPU に分散してトレーニングを最適化したい場合は、TensorFlow のさまざまな分散トレーニング戦略によって GPU の使用を最適化し、GPU でのトレーニングを処理できます。 tf.distribute.MirroredStrategy は最もよく使用される戦略です。どのように機能しますか? - すべての変数とモデル グラフが複製されます。
- 入力はレプリカ全体に均等に分散されます。
- 各レプリカは、受信した入力の損失と勾配を計算します。
- すべての同期レプリカの勾配が合計されます。
- 同期後、各レプリカの変数に対して同一の更新が行われます。
- strategy = tf.distribute.MirroredStrategy() と strategy.scope():
- モデル = tf.keras.Sequential([ tf.keras.layers.Conv2D( 32 , 3 , activation= 'relu' , input_shape=( 28 , 28 , 1 )
- )、tf.keras.layers.MaxPooling2D()、tf.keras.layers.Flatten()、tf.keras.layers.Dense( 64 、アクティベーション = 'relu' )、
- tf.keras.layers.dense( 10 )の構文
- ]) model.compile( loss = "sparse_categorical_crossentropy" ,
- オプティマイザー = "adam" 、
- メトリック=[ '精度' ]
- )
|