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.py の build_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
モデルには、IteratorGetNext
や LookupTableFindV2
などの 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 モデルを生成します。