为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 TF Lite 中添加预处理步骤

如何在 TF Lite 中添加预处理步骤

繁星淼淼 2021-06-06 07:49:01
我使用具有 4 个特征的简单虹膜数据。而且我想在进入网络之前做一些预处理步骤。例如,我希望我的 NN 只接收 3 个特征,它们是两个连续原始特征的平均值。# x shape is 120 data x 4 featurestmp = np.zeros((x.shape[0],x.shape[1]-1))for i in range(x.shape[1]-1):    tmp[:,i] = (x[:,i]+x[:,i+1])/2.x = deepcopy(tmp) # after preprocess its shape 120 x 3 features我尝试添加这些步骤input_function并将所有feature_columns形状的定义更改为 3:def input_function(x, y, is_train):    tmp = np.zeros((x.shape[0],x.shape[1]-1))    for i in range(x.shape[1]-1):        tmp[:,i] = (x[:,i]+x[:,i+1])/2.    x = deepcopy(tmp)    dict_x = { "thisisinput" : x }    dataset = tf.data.Dataset.from_tensor_slices((        dict_x, y    ))    if is_train:        dataset = dataset.shuffle(num_train).repeat(num_epoch).batch(num_train)    else:           dataset = dataset.batch(num_test)    return dataset我训练分类器的方式:feature_columns = [    tf.feature_column.numeric_column(key="featurename",shape=3),]classifier = tf.estimator.DNNClassifier(    feature_columns=feature_columns,    hidden_units=[50, 20],    n_classes=3,    optimizer=tf.train.GradientDescentOptimizer(0.001),    activation_fn=tf.nn.relu,    model_dir = 'modeliris2/')classifier.train(    input_fn=lambda:input_function(xtrain, ytrain, True))我的服务输入功能:def my_serving_input_fn2():    input_data = {        "featurename" : tf.placeholder(tf.float32, [None, 3], name='inputtensors')    }    return tf.estimator.export.ServingInputReceiver(input_data, input_data)当我运行它时它有效,但是如果我冻结模型然后用它来预测,它就不起作用。它说:ValueError: 无法为 Tensor 'import/inputtensors:0' 提供形状 (1, 4) 的值,其形状为 '(?, 3)'如果我改变feature_columns对my_serving_input_fn[无,4],它仍然得到一个错误冻结模式后:InvalidArgumentError(回溯见上文):reshape 的输入是一个有 4 个值的张量,但请求的形状有 3我的问题是,如果我需要在我的模型中包含任何预处理或特征工程步骤(如信号预处理中的 MFCC 等),我应该把它放在哪里?我的方法正确吗?为什么会发生错误?或者有更好的解决方案吗?还有一个问题,如果在我的预处理步骤中我需要包含外部文件(如文本预处理中的停用词列表等),是否仍然可以包含这些文件以使用 TF lite 进行预处理?
查看完整描述

2 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

从技术上讲,您可以将预处理步骤放在两个地方。我将tflite以此为例。


模型外的预处理。这意味着您的驱动程序中有一个 mfcc:


model = new model(CNN, RNN, ...)

while(stream) {

   energy = mfcc(audio)

   model.invoke(energy)

}

如果预处理步骤已经是一个操作(通常不是...),你可以在你的模型中包含这个操作:


model = new model(MFCC, CNN, RNN, ...)

while(stream) {

    model.invoke(audio)

}

话虽如此,选项 1 是最平易近人的。希望能帮助到你。


查看完整回答
反对 回复 2021-06-09
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

在这种情况下,预处理发生在 python 中。因此,如果您在 Python 中调用 TF Lite 图,您将能够使用任何 Python 原语。


查看完整回答
反对 回复 2021-06-09
  • 2 回答
  • 0 关注
  • 216 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号