Оценщик TensorFlow.DNNClassifier: export_savedmodel вызвал «ValueError: Неверная функция» - PullRequest
0 голосов
/ 29 августа 2018

Я прочитал много тем, но ни один из ответов не помог мне ...

У меня есть классификатор 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: Недопустимая функция 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)

Но он также возвращает почти ошибку:

ValueError: Feature dummy_feature_N_value_M отсутствует в словаре возможностей.

Когда я проверяю список feature_columns - есть:

_NumericColumn (key = 'dummy_feature_N_value_M', shape = (1,), default_value = None, dtype = tf.float32, normalizer_fn = None),

Что я делаю не так?

1 Ответ

0 голосов
/ 31 августа 2018

не знаю, что это было ... Но теперь все работает.

Сначала я пытался не использовать созданные мной пустые столбцы 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)

А затем создал список feature_columns с использованием функций TensorFlow:

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

Объявлены "классификатор" и "train_input_fn", как указано в исходном посте, обученный классификатор.

После этого оба

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 model

...