猿问

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

我使用具有 4 个特征的简单虹膜数据。而且我想在进入网络之前做一些预处理步骤。例如,我希望我的 NN 只接收 3 个特征,它们是两个连续原始特征的平均值。


# x shape is 120 data x 4 features

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) # 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 进行预处理?


繁星淼淼
浏览 250回答 2
2回答

噜噜哒

从技术上讲,您可以将预处理步骤放在两个地方。我将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 是最平易近人的。希望能帮助到你。

慕无忌1623718

在这种情况下,预处理发生在 python 中。因此,如果您在 Python 中调用 TF Lite 图,您将能够使用任何 Python 原语。
随时随地看视频慕课网APP

相关分类

Python
我要回答