Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在TF Lite中添加预处理步骤_Python_Tensorflow_Tensorflow Estimator_Tensorflow Lite - Fatal编程技术网

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

Python 如何在TF Lite中添加预处理步骤,python,tensorflow,tensorflow-estimator,tensorflow-lite,Python,Tensorflow,Tensorflow Estimator,Tensorflow 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 it

我使用简单的虹膜数据,它有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\u函数中添加这些步骤,并将所有
feature\u列的定义更改为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\u service\u input\u fn上的
feature\u columns
更改为[None,4],则冻结模型后仍会出现错误:

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

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


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

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

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

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

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

    model = new model(MFCC, CNN, RNN, ...)
    while(stream) {
        model.invoke(audio)
    }
    
  • 尽管如此,选择1是最容易接近的。希望能有帮助