与python模型相比,tensorflow lite模型给出了非常不同的精度值

与python模型相比,tensorflow lite模型给出了非常不同的精度值,python,python-3.x,tensorflow,tensorflow-lite,Python,Python 3.x,Tensorflow,Tensorflow Lite,我使用的是tensorflow 1.10 Python 3.6 我的代码基于TensorFlow提供的premade。这意味着,我使用的是Tensorflow DNN预制分类器,区别如下: 10个功能,而不是4个 5节课,而不是3节课 可从以下链接下载测试和培训文件: 我已经编写了一个代码,将这个分类器导出为tflite格式,但是python模型中的精度高于75%,但是当导出时,精度降低到大约45%,这意味着大约30%的精度丢失(这太多了)。 我用不同的数据集尝试了代码,在所有这些代码中,

我使用的是tensorflow 1.10 Python 3.6

我的代码基于TensorFlow提供的premade。这意味着,我使用的是Tensorflow DNN预制分类器,区别如下:

  • 10个功能,而不是4个
  • 5节课,而不是3节课
可从以下链接下载测试和培训文件:

我已经编写了一个代码,将这个分类器导出为tflite格式,但是python模型中的精度高于75%,但是当导出时,精度降低到大约45%,这意味着大约30%的精度丢失(这太多了)。 我用不同的数据集尝试了代码,在所有这些代码中,导出后的精度都会降低很多! 这让我觉得TocoConverter函数出了问题,或者可能是我导出到tflite时出错了,丢失了一个参数或类似的东西

这是我生成模型的方式:

classifier = tf.estimator.DNNClassifier(
        feature_columns=my_feature_columns,
        hidden_units=[100, 500],
        optimizer=tf.train.AdagradOptimizer(learning_rate=0.003),
        n_classes=num_labels,
        model_dir="myModel")
这是我用来转换为tflite的函数:

converter = tf.contrib.lite.TocoConverter.from_frozen_graph(final_model_path, input_arrays, output_arrays, input_shapes={"dnn/input_from_feature_columns/input_layer/concat": [1, 10]})
        tflite_model = converter.convert()
我分享了完整的代码,其中我还计算了生成的.tflite文件的准确性。

import argparse
导入tensorflow作为tf
作为pd进口熊猫
导入csv
从tensorflow.python.tools导入冻结图
从tensorflow.python.tools导入针对推理库的优化
将numpy作为np导入
parser=argparse.ArgumentParser()
add_参数('--batch_size',default=100,type=int,help='batch size'))
add_参数('--train_steps',默认值=1000,type=int,
帮助='培训步骤数')
功能\u全局=无
特征规格=无
模型名称='myModel'
def加载数据(列车路径、测试路径):
“”“将iris数据集返回为(序列号x,序列号y),(测试序列号x,测试序列号y)。”
开放式(列车路径,新线='')为f:
读卡器=csv。读卡器(f)
列名称=下一个(读卡器)
y_name=列名称[-1]
列车=pd.read\u csv(列车路径,名称=列名称,标题=0)
train\u x,train\u y=train,train.pop(y\u名称)
test=pd.read\u csv(test\u路径,name=column\u name,header=0)
test\u x,test\u y=test,test.pop(y\u名称)
返回(列车x,列车y),(测试列车x,测试列车y)
def序列输入(特征、标签、批次大小):
“”“用于培训的输入函数”“”
#将输入转换为数据集。
dataset=tf.data.dataset.from_tensor_切片((dict(特征),标签))
#洗牌、重复和批处理示例。
dataset=dataset.shuffle(1000).repeat().batch(批大小)
#返回数据集。
返回数据集
def eval_输入_fn(特征、标签、批次大小):
“”“用于计算或预测的输入函数”“”
功能=dict(功能)
如果标签为“无”:
#无标签,仅使用特征。
输入=特征
其他:
输入=(特征、标签)
#将输入转换为数据集。
dataset=tf.data.dataset.from_tensor_切片(输入)
#批处理示例
断言批次大小不是无,“批次大小不能是无”
dataset=dataset.batch(批次大小)
#返回数据集。
返回数据集
def总管(argv):
args=parser.parse_args(argv[1:])
列车路径=“trainData.csv”
test_path=“testData.csv”
#获取数据
(列车x,列车y),(测试列车x,测试列车y)=负载数据(列车路径,测试列车路径)
#装载标签
num_标签=5
#功能列描述如何使用输入。
my_feature_columns=[]
对于车内钥匙×钥匙():
my\u feature\u columns.append(tf.feature\u column.numeric\u column(key=key))
#构建2个隐藏层DNN
分类器=tf.estimator.DNNClassifier(
功能列=我的功能列,
隐藏单位=[100500],
优化器=tf.train.ADAGRAD优化器(学习率=0.003),
#模型必须在“num_标签”类之间进行选择。
n_类=num_标签,
model_dir=“myModel”)
#训练模型
列车(
输入\ fn=λ:列\输入\ fn(列\ x,列\ y,
参数。批次大小),
步骤=参数训练(步骤)
#评估模型。
eval_结果=分类器.evaluate(
输入fn=λ:评估输入fn(测试x,测试y,
参数。批次(单位尺寸)
打印('\n测试集精度:{精度:0.3f}\n'。格式(**eval_结果))
#出口模式
feature\u spec=tf.feature\u column.make\u parse\u example\u spec(my\u feature\u columns)
SERVICE\u input\u fun=tf.estimator.export.build\u parsing\u SERVICE\u input\u receiver\u fn(功能规格)
保存的\u模型\u路径=分类器.export\u保存的模型(
export\u dir\u base=“out”,
服务输入接收器=服务输入乐趣,
当_text=True时,
检查点路径=分类器。最新检查点(),
)
tf.reset_default_graph()
var=tf.变量(0)
使用tf.Session()作为sess:
#首先,让我们加载元图并恢复权重
sess.run(tf.global\u variables\u initializer())
最新检查点路径=分类器。最新检查点()
saver=tf.train.import_meta_图(最新检查点_路径+'.meta')
saver.restore(sess、最新检查点路径)
input_数组=[“dnn/input_来自特征列/input_层/concat”]
输出数组=[“dnn/logits/BiasAdd”]
冻结的\u图形\u def=tf.graph\u util.convert\u变量\u到\u常量(
sess,sess.graph_def,
输出节点名称=[“dnn/logits/BiasAdd”])
freezed\u graph=“out/freezed\u graph.pb”
将tf.gfile.FastGFile(冻结图,“wb”)作为f:
f、 写入(冻结图定义序列化字符串())
#将原始graphdef保存到文本文件
以open(“estimator_graph.pbtxt”、“w”)作为fp:
fp.write(str(sess.graph_def))
#将冻结的图形定义保存到文本文件
以open(“estimator\u freezed\u graph.pbtxt”、“w”)作为fp:
fp.write(str(冻结图定义))
输入\节点\名称=输入\数组
输出节点名称=