TensorFlow ワイドおよびディープ・ファミリー・モデルの変換

危険

ここで説明されているコードは非推奨になりました。従来のソリューションの適用を避けるため使用しないでください。下位互換性を確保するためにしばらく保持されますが、最新のアプリケーションでは使用してはなりません

このガイドでは、非推奨となった変換方法について説明します。新しい推奨方法に関するガイドは、Python チュートリアルに記載されています。

ワイドモデルとディープモデルは、オブジェクトの特徴をそれぞれ記憶および一般化するワイドパーツとディープパーツの組み合わせです。これらのモデルには、数値特徴、カテゴリー特徴、スパース特徴、逐次特徴など、さまざまなタイプのオブジェクト特徴を含めることができます。これらの特徴タイプは Tensorflow tf.feature_column API を通じて指定されます。以下の表は、OpenVINO ツールキットでサポートされている機能タイプを示しています。

数値

(重み付き) カテゴリー

カテゴリーハッシュ

バケット化された

シーケンシャル

交差

はい

はい

いいえ

はい

はい

いいえ

OpenVINO は文字列タイプのテンソルとそれらの操作をカバーしていないため、ハッシュと交差特徴を備えたカテゴリーは現在サポートされていません。

ワイドおよびディープモデルの例の準備

ステップ 1. TensorFlow モデルを含む GitHub リポジトリーのクローンの作成とワイドモデルとディープモデルの例を含むディレクトリーへの移動

git clone https://github.com/tensorflow/models.git --branch r2.2.0; cd official/r1/wide_deep

ワイドおよびディープモデルはリポジトリーの master ブランチには存在しませんが、r2.2.0 ブランチでは引き続き使用できます。

ステップ 2. モデルのトレーニング

OpenVINO™ ツールキットはハッシュおよび交差特徴を含むカテゴリーをサポートしていないため、census_dataset.pybuild_model_columns() 関数を次のように変更して、モデル内でそのような特徴タイプをオフにする必要があります。

 def build_model_columns(): 
"""Builds a set of wide and deep feature columns."""# Continuous variable columns 
age = tf.feature_column.numeric_column('age') 
education_num = tf.feature_column.numeric_column('education_num') 
capital_gain = tf.feature_column.numeric_column('capital_gain') 
capital_loss = tf.feature_column.numeric_column('capital_loss') 
hours_per_week = tf.feature_column.numeric_column('hours_per_week') 
education = tf.feature_column.categorical_column_with_vocabulary_list( 
    education', [ 
        'Bachelors', 'HS-grad', '11th', 'Masters', '9th', 'Some-college', 
        'Assoc-acdm', 'Assoc-voc', '7th-8th', 'Doctorate', 'Prof-school', 
        '5th-6th', '10th', '1st-4th', 'Preschool', '12th']) 
marital_status = tf.feature_column.categorical_column_with_vocabulary_list( 
    'marital_status', [ 
        'Married-civ-spouse', 'Divorced', 'Married-spouse-absent', 
        'Never-married', 'Separated', 'Married-AF-spouse', 'Widowed']) 
relationship = tf.feature_column.categorical_column_with_vocabulary_list( 
    'relationship', [ 
        'Husband', 'Not-in-family', 'Wife', 'Own-child', 'Unmarried', 
        'Other-relative']) 
workclass = tf.feature_column.categorical_column_with_vocabulary_list( 
    'workclass', [ 
        'Self-emp-not-inc', 'Private', 'State-gov', 'Federal-gov', 
        'Local-gov', '?', 'Self-emp-inc', 'Without-pay', 'Never-worked']) 
# To show an example of hashing: 
#occupation = tf.feature_column.categorical_column_with_hash_bucket( 
# 'occupation', hash_bucket_size=_HASH_BUCKET_SIZE) 
# Transformations. 
age_buckets = tf.feature_column.bucketized_column( 
    age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65]) 
# Wide columns and deep columns. 
base_columns = [ 
    education, marital_status, relationship, workclass, 
    age_buckets, ] 
crossed_columns = [] 
wide_columns = base_columns + crossed_columns 
deep_columns = [ 
    age, 
    education_num, 
    capital_gain, 
    capital_loss, 
    hours_per_week, 
    tf.feature_column.indicator_column(workclass), 
    tf.feature_column.indicator_column(education), 
    tf.feature_column.indicator_column(marital_status), 
    tf.feature_column.indicator_column(relationship), 
    # To show an example of embedding 
] 
return wide_columns, deep_columns

その後、次のコマンドでトレーニングを開始します。

python census_main.py

ワイドおよびディープモデルを IR に変換

次のコマンドラインを使用して、チェックポイントを含む保存されたモデルファイルを変換します。

mo 
--input_checkpoint checkpoint --input_meta_graph model.ckpt.meta 
--input "IteratorGetNext:0[2], 
        IteratorGetNext:1[2], 
        IteratorGetNext:2[2], 
        IteratorGetNext:4[2], 
        IteratorGetNext:7[2], 

linear/linear_model/linear_model/linear_model/education/to_sparse_input/indices:0[10,2]{i64}, 

linear/linear_model/linear_model/linear_model/education/hash_table_Lookup/LookupTableFindV2:0[10]{i64}, 

linear/linear_model/linear_model/linear_model/education/to_sparse_input/dense_shape:0[2]{i64}->[2,50], 

linear/linear_model/linear_model/linear_model/marital_status/to_sparse_input/indices:0[10,2]{i64}, 

linear/linear_model/linear_model/linear_model/marital_status/hash_table_Lookup/LookupTableFindV2:0[10]{i64}, 

linear/linear_model/linear_model/linear_model/marital_status/to_sparse_input/dense_shape:0[2]{i64}->[2,50], 

linear/linear_model/linear_model/linear_model/relationship/to_sparse_input/indices:0[10,2]{i64}, 

linear/linear_model/linear_model/linear_model/relationship/hash_table_Lookup/LookupTableFindV2:0[10]{i64}, 

linear/linear_model/linear_model/linear_model/relationship/to_sparse_input/dense_shape:0[2]{i64}->[2,50], 

linear/linear_model/linear_model/linear_model/workclass/to_sparse_input/indices:0[10,2]{i64}, 

linear/linear_model/linear_model/linear_model/workclass/hash_table_Lookup/LookupTableFindV2:0[10]{i64}, 

linear/linear_model/linear_model/linear_model/workclass/to_sparse_input/dense_shape:0[2]{i64}->[2,50], 

dnn/input_from_feature_columns/input_layer/education_indicator/to_sparse_input/indices:0[10,2]{i64}, 

dnn/input_from_feature_columns/input_layer/education_indicator/hash_table_Lookup/LookupTableFindV2:0[10]{i64}, 

dnn/input_from_feature_columns/input_layer/education_indicator/to_sparse_input/dense_shape:0[2]{i64}->[2,50], 

dnn/input_from_feature_columns/input_layer/marital_status_indicator/to_sparse_input/indices:0[10,2]{i64}, 

dnn/input_from_feature_columns/input_layer/marital_status_indicator/hash_table_Lookup/LookupTableFindV2:0[10]{i64}, 

dnn/input_from_feature_columns/input_layer/marital_status_indicator/to_sparse_input/dense_shape:0[2]{i64}->[2,50], 

dnn/input_from_feature_columns/input_layer/relationship_indicator/to_sparse_input/indices:0[10,2]{i64}, 

dnn/input_from_feature_columns/input_layer/relationship_indicator/hash_table_Lookup/LookupTableFindV2:0[10]{i64}, 

dnn/input_from_feature_columns/input_layer/relationship_indicator/to_sparse_input/dense_shape:0[2]{i64}->[2,50], 

dnn/input_from_feature_columns/input_layer/workclass_indicator/to_sparse_input/indices:0[10,2]{i64}, 

dnn/input_from_feature_columns/input_layer/workclass_indicator/hash_table_Lookup/LookupTableFindV2:0[10]{i64}, 

dnn/input_from_feature_columns/input_layer/workclass_indicator/to_sparse_input/dense_shape:0[2]{i64}->[2,50]"
--output head/predictions/probabilities

モデルには、IteratorGetNextLookupTableFindV2 などの OpenVINO™ ツールキットでサポートされない操作が含まれているため、モデル・オプティマイザーはこれらのノードをプルーニングする必要があります。プルーニングは、–input オプションで指定します。IteratorGetNext:* ノードのプルーニングは数値特徴に対応します。各カテゴリー特徴量のプルーニングは、*/to_sparse_input/indices:0, */hash_table_Lookup/LookupTableFindV2:0, および */to_sparse_input/dense_shape:0 のノードに対する 3 つのプルーニングで構成されます。

上記のコマンドラインは、実際のカテゴリー特徴値の合計数が 10 に等しく、1 つのオブジェクトのスパースカテゴリー特徴量の最大サイズが 50 に等しい、2 つのオブジェクトのバッチの OpenVINO モデルを生成します。