TensorFlow estimator.DNNClassifier: export_savedmodel caused "ValueError: Invalid feature"
TensorFlow estimator.DNNClassifier: export_savedmodel caused "ValueError: Invalid feature"
我阅读了很多主题,但是 none 的答案对我有帮助...
我有 DNN 分类器:
import tensorflow as tf
feature_columns = []
for key in X_train.keys():
feature_columns.append(tf.feature_column.numeric_column(key=key))
classifier = tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[10, 20, 10],
n_classes=2
)
def train_input_fn(features, labels, batch_size):
"""An input function for training"""
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
dataset = dataset.shuffle(10).repeat().batch(batch_size)
return dataset
#train the Model
batch_size = 100
train_steps = 400
for i in range(0,100):
classifier.train(
input_fn=lambda:train_input_fn(X_train, y_train, batch_size),
steps=train_steps
)
DataFrame X_train 包含 452 个数字列(其中大部分 - 由 OneHodEncode 虚拟列转换):形状为 (84692, 452)。
同样是 len(feature_columns) = 452
但是当我尝试使用脚本保存模型时:
def serving_input_receiver_fn():
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns)
return tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)()
classifier.export_savedmodel(export_dir_base="export_model/", serving_input_receiver_fn=_serving_input_receiver_fn)
我收到一个错误:
ValueError: Invalid feature dummy_feature_N_value_M:0.
还尝试使用另一个脚本来保存(但在这里我不了解每个参数值...):
def serving_input_receiver_fn():
serialized_tf_example = tf.placeholder(dtype=tf.string, shape=[None], name='input_tensors')
receiver_tensors = {"predictor_inputs": serialized_tf_example}
feature_spec = {"words": tf.FixedLenFeature([452],tf.float32)}
features = tf.parse_example(serialized_tf_example, feature_spec)
return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)
classifier.export_savedmodel(export_dir_base="export_model/", serving_input_receiver_fn=serving_input_receiver_fn)
但它也returns差点报错:
ValueError: Feature dummy_feature_N_value_M is not in features dictionary.
当我检查 feature_columns 列表时 - 是否存在:
_NumericColumn(key='dummy_feature_N_value_M', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
我做错了什么?
不知道那是什么...但现在一切正常。
首先,我尝试不使用自己创建的 OneHodEncode 虚拟列,而是输入带有分类列的初始数据帧 "train_dummy_features":
# split columns and indexes of categorical and continues columns
categorical_columns = list(train_dummy_features.select_dtypes(include=['category','object']))
print(categorical_columns)
numeric_columns = list(train_dummy_features.select_dtypes(include=['int','uint8']))
print(numeric_columns)
cat_features_indexes = [train_dummy_features.columns.get_loc(c) for c in train_dummy_features.columns if c in categorical_columns]
print(cat_features_indexes)
continues_features_indexes = [train_dummy_features.columns.get_loc(c) for c in train_dummy_features.columns if c not in categorical_columns]
print(continues_features_indexes)
然后使用 TensorFlow 函数创建 feature_columns 列表:
numeric_features = [tf.feature_column.numeric_column(key = column) for column in numeric_columns]
print(numeric_features)
categorical_features = [
tf.feature_column.embedding_column(
categorical_column = tf.feature_column.categorical_column_with_vocabulary_list
(key = column
, vocabulary_list = train_dummy_features[column].unique()
),
dimension = len(train_dummy_features[column].unique())
)
for column in categorical_columns
]
print(categorical_features[3])
feature_columns = numeric_features + categorical_features
feature_columns[2]
并将带有分类列的初始数据帧 "train_dummy_features" 放入 X_train:
X = train_dummy_features
y = train_measure # since we already have dataframe with the measure
X_train, y_train = X, y
声明 "classifier" 和 "train_input_fn" 如初始 post 中指定的,经过训练的分类器。
在那之后
def serving_input_receiver_fn():
#feature_spec = {INPUT_TENSOR_NAME: tf.FixedLenFeature(dtype=tf.float32, shape=[452])}
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns)
return tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)()
classifier.export_savedmodel(export_dir_base="export_model2/", serving_input_receiver_fn=serving_input_receiver_fn)
和
def serving_input_receiver_fn():
serialized_tf_example = tf.placeholder(dtype=tf.string, shape=[None], name='input_tensors')
receiver_tensors = {"predictor_inputs": serialized_tf_example}
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns) #{"words": tf.FixedLenFeature([len(feature_columns)],tf.float32)}
features = tf.parse_example(serialized_tf_example, feature_spec)
return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)
classifier.export_savedmodel(export_dir_base="export_model3/", serving_input_receiver_fn=serving_input_receiver_fn)
成功导出模型。
我试图重复昨天导致错误的第一个版本的步骤 - 但现在无法重复错误。
因此,描述的步骤已成功训练和导出 tf.estimator.DNNClassifier 模型
我阅读了很多主题,但是 none 的答案对我有帮助...
我有 DNN 分类器:
import tensorflow as tf
feature_columns = []
for key in X_train.keys():
feature_columns.append(tf.feature_column.numeric_column(key=key))
classifier = tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[10, 20, 10],
n_classes=2
)
def train_input_fn(features, labels, batch_size):
"""An input function for training"""
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
dataset = dataset.shuffle(10).repeat().batch(batch_size)
return dataset
#train the Model
batch_size = 100
train_steps = 400
for i in range(0,100):
classifier.train(
input_fn=lambda:train_input_fn(X_train, y_train, batch_size),
steps=train_steps
)
DataFrame X_train 包含 452 个数字列(其中大部分 - 由 OneHodEncode 虚拟列转换):形状为 (84692, 452)。 同样是 len(feature_columns) = 452
但是当我尝试使用脚本保存模型时:
def serving_input_receiver_fn():
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns)
return tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)()
classifier.export_savedmodel(export_dir_base="export_model/", serving_input_receiver_fn=_serving_input_receiver_fn)
我收到一个错误:
ValueError: Invalid feature dummy_feature_N_value_M:0.
还尝试使用另一个脚本来保存(但在这里我不了解每个参数值...):
def serving_input_receiver_fn():
serialized_tf_example = tf.placeholder(dtype=tf.string, shape=[None], name='input_tensors')
receiver_tensors = {"predictor_inputs": serialized_tf_example}
feature_spec = {"words": tf.FixedLenFeature([452],tf.float32)}
features = tf.parse_example(serialized_tf_example, feature_spec)
return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)
classifier.export_savedmodel(export_dir_base="export_model/", serving_input_receiver_fn=serving_input_receiver_fn)
但它也returns差点报错:
ValueError: Feature dummy_feature_N_value_M is not in features dictionary.
当我检查 feature_columns 列表时 - 是否存在:
_NumericColumn(key='dummy_feature_N_value_M', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
我做错了什么?
不知道那是什么...但现在一切正常。
首先,我尝试不使用自己创建的 OneHodEncode 虚拟列,而是输入带有分类列的初始数据帧 "train_dummy_features":
# split columns and indexes of categorical and continues columns
categorical_columns = list(train_dummy_features.select_dtypes(include=['category','object']))
print(categorical_columns)
numeric_columns = list(train_dummy_features.select_dtypes(include=['int','uint8']))
print(numeric_columns)
cat_features_indexes = [train_dummy_features.columns.get_loc(c) for c in train_dummy_features.columns if c in categorical_columns]
print(cat_features_indexes)
continues_features_indexes = [train_dummy_features.columns.get_loc(c) for c in train_dummy_features.columns if c not in categorical_columns]
print(continues_features_indexes)
然后使用 TensorFlow 函数创建 feature_columns 列表:
numeric_features = [tf.feature_column.numeric_column(key = column) for column in numeric_columns]
print(numeric_features)
categorical_features = [
tf.feature_column.embedding_column(
categorical_column = tf.feature_column.categorical_column_with_vocabulary_list
(key = column
, vocabulary_list = train_dummy_features[column].unique()
),
dimension = len(train_dummy_features[column].unique())
)
for column in categorical_columns
]
print(categorical_features[3])
feature_columns = numeric_features + categorical_features
feature_columns[2]
并将带有分类列的初始数据帧 "train_dummy_features" 放入 X_train:
X = train_dummy_features
y = train_measure # since we already have dataframe with the measure
X_train, y_train = X, y
声明 "classifier" 和 "train_input_fn" 如初始 post 中指定的,经过训练的分类器。
在那之后
def serving_input_receiver_fn():
#feature_spec = {INPUT_TENSOR_NAME: tf.FixedLenFeature(dtype=tf.float32, shape=[452])}
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns)
return tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)()
classifier.export_savedmodel(export_dir_base="export_model2/", serving_input_receiver_fn=serving_input_receiver_fn)
和
def serving_input_receiver_fn():
serialized_tf_example = tf.placeholder(dtype=tf.string, shape=[None], name='input_tensors')
receiver_tensors = {"predictor_inputs": serialized_tf_example}
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns) #{"words": tf.FixedLenFeature([len(feature_columns)],tf.float32)}
features = tf.parse_example(serialized_tf_example, feature_spec)
return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)
classifier.export_savedmodel(export_dir_base="export_model3/", serving_input_receiver_fn=serving_input_receiver_fn)
成功导出模型。
我试图重复昨天导致错误的第一个版本的步骤 - 但现在无法重复错误。
因此,描述的步骤已成功训练和导出 tf.estimator.DNNClassifier 模型