【问题标题】:How to add preprocessing steps in TF Lite如何在 TF Lite 中添加预处理步骤
【发布时间】:2018-09-03 06:26:57
【问题描述】:

我使用具有 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: 无法为形状为“(?, 3)”的张量“import/inputtensors:0”提供形状 (1, 4) 的值

如果我把my_serving_input_fn上的feature_columns改成[None, 4],冻结模型后还是报错:

InvalidArgumentError(回溯见上文):reshape 的输入是一个有 4 个值的张量,但请求的形状有 3 个

我的问题,如果我需要在我的模型中包含任何预处理或特征工程步骤(如信号预处理中的 MFCC 等),我应该把它放在哪里?我的方法正确吗?为什么会发生错误?或者有更好的解决方案吗?

还有一个问题,如果在我的预处理步骤中我需要包含外部文件(如文本预处理中的停用词列表等),是否仍然可以包含这些文件以使用 TF lite 进行预处理?

【问题讨论】:

    标签: python tensorflow tensorflow-estimator tensorflow-lite


    【解决方案1】:

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

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

      model = new model(CNN, RNN, ...)
      while(stream) {
         energy = mfcc(audio)
         model.invoke(energy)
      }
      
    2. 如果预处理步骤已经是 Op(通常不是...),您可以在模型中包含 Op:

      model = new model(MFCC, CNN, RNN, ...)
      while(stream) {
          model.invoke(audio)
      }
      

    话虽如此,选项 1 是最平易近人的。希望对您有所帮助。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 1970-01-01
        • 2022-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-09
        相关资源
        最近更新 更多