如何在 TF 精简版中添加预处理步骤



我使用具有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中添加这些步骤,并将所有形状的定义更改为 3feature_columns

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

如果我将my_serving_input_fn上的feature_columns更改为 [None, 4],冻结模型后仍然出现错误:

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新