我使用具有 4 个特征的简单虹膜数据。而且我想在进入网络之前做一些预处理步骤。例如,我希望我的 NN 只接收 3 个特征,它们是两个连续原始特征的平均值。# x shape is 120 data x 4 featurestmp = 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 进行预处理?
2 回答

噜噜哒
TA贡献1784条经验 获得超7个赞
从技术上讲,您可以将预处理步骤放在两个地方。我将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
TA贡献1744条经验 获得超4个赞
在这种情况下,预处理发生在 python 中。因此,如果您在 Python 中调用 TF Lite 图,您将能够使用任何 Python 原语。
添加回答
举报
0/150
提交
取消