将tensorflow 2估计量转换为tf.lite

问题描述 投票:0回答:1

我正在尝试将估算器LinearClassifier转换为tflite。但是,代码抛出了一些错误。.我无法理解我在哪里做错了。

这是我的代码

import pandas as pd
import tensorflow as tf

dftrain = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/train.csv')
dfeval = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/eval.csv')
y_train = dftrain.pop('survived')
y_eval = dfeval.pop('survived')

#create feature columns. For testing I am using only numeric ones
NUMERIC_COLUMNS = ['age', 'fare']

feature_columns = []

for feature_name in NUMERIC_COLUMNS:
    feature_columns.append(tf.feature_column.numeric_column(feature_name,
                                           dtype=tf.float32))

# Use entire batch since this is such a small dataset.
NUM_EXAMPLES = len(y_train)

def make_input_fn(X, y, n_epochs=None, shuffle=True):
    def input_fn():
        dataset = tf.data.Dataset.from_tensor_slices((dict(X), y))
        if shuffle:
          dataset = dataset.shuffle(NUM_EXAMPLES)
        # For training, cycle thru dataset as many times as need (n_epochs=None).
        dataset = dataset.repeat(n_epochs)
        # In memory training doesn't use batching.
        dataset = dataset.batch(NUM_EXAMPLES)
        return dataset
    return input_fn

# Training and evaluation input functions.
train_input_fn = make_input_fn(dftrain[NUMERIC_COLUMNS], y_train)
eval_input_fn = make_input_fn(dfeval[NUMERIC_COLUMNS], y_eval, shuffle=False, n_epochs=1)


linear_est = tf.estimator.LinearClassifier(feature_columns)

# Train model.
linear_est.train(train_input_fn, max_steps=100)


# Evaluation.
result = linear_est.evaluate(eval_input_fn)

因此模型运行正常。

print(pd.Series(result))

accuracy                  0.659091
accuracy_baseline         0.625000
auc                       0.667095
auc_precision_recall      0.589936
average_loss              0.619227
label/mean                0.375000
loss                      0.619227
precision                 0.764706
prediction/mean           0.336755
recall                    0.131313
global_step             100.000000
dtype: float64

现在节省的部分:

serving_input_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(
  tf.feature_column.make_parse_example_spec(feature_columns))
model_dir = 'model_data'
path = linear_est.export_saved_model(model_dir, serving_input_fn)

当我使用时:

converter = tf.lite.TFLiteConverter.from_saved_model(path)
tflite_model = converter.convert()

它引发错误:

ValueError: This converter can only convert a single ConcreteFunction. Converting multiple functions is under development.

我也尝试过:

saved_model_obj = tf.saved_model.load(export_dir=path)
concrete_func = saved_model_obj.signatures['serving_default']
converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])
tflite_model = converter.convert()

错误是:

ConverterError: See console for info.
2020-02-18 16:23:15.446583: I tensorflow/lite/toco/import_tensorflow.cc:193] Unsupported data type in placeholder op: 20
2020-02-18 16:23:15.446687: F tensorflow/lite/toco/import_tensorflow.cc:2706] Check failed: status.ok() Input_content string_val doesn't have the right dimensions for this string tensor
     (while processing node 'head/AsString')
Fatal Python error: Aborted

请帮助。

python tensorflow2.0 tensorflow-lite tensorflow-estimator
1个回答
0
投票

我在所有Estimators上都遇到同样的问题,在使用BoostedTreesClassifier和具体函数时,它在另一个地方开始失败:Init node boosted_trees/transform_features/alone_indicator/alone_lookup/hash_table/table_init/LookupTableImportV2 doesn't exist in graph。 TF版本2.2.0-rc3。

您现在有解决方案吗?

© www.soinside.com 2019 - 2024. All rights reserved.