我使用简单的虹膜数据,它有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包含这些文件以进行预处理吗?