代码之家  ›  专栏  ›  技术社区  ›  malioboro gaurav_iphone

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

  •  1
  • malioboro gaurav_iphone  · 技术社区  · 6 年前

    我使用简单的虹膜数据,它有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)”的张量“导入/输入传感器:0”提供形状(1,4)的值

    如果我改变 专题专栏 在…上 my_serving_input_fn 对于[None,4],冻结模型后仍然会出现错误:

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

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

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   malioboro gaurav_iphone    5 年前

    从技术上讲,你可以把预处理步骤放在两个地方。我会用 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
  •  0
  •   achowdhery    5 年前

    在本例中,预处理在python中进行。因此,如果在python中调用TF Lite图,就可以使用任何python原语。