我已经用tf.data.Dataset
训练了Keras模型来进行输入预处理。
现在,我正在另一个Python脚本中尝试使用该模型进行推理。我不知道如何使用Tensorflow预处理作为keras模型的输入。
在Tensorflow 2.0中,这非常简单,其工作方式如下:
model = MobileNetV2(
input_shape=(68, 96, 1), alpha=1.0, include_top=True,
weights=None, classes=3)
model.load_weights(...)
@tf.function
def predict(data):
y_pred = model(preprocess_fn(data))
return y_pred
但是在TF 1.14中,我无法使其正常工作。 我试图建立这样的模型
input_sound = tf.keras.layers.Input(shape=(window_size,))
net_input = tf.keras.layers.Lambda(preprocess_fn)(input_sound)
model = MobileNetV2(
input_shape=(68, 96, 1), alpha=1.0, include_top=True,
weights=None, classes=3)
model.load_weights(args.model)
model = tf.keras.Model(input_sound, model(net_input))
并将其用于这样的推断:
with tf.compat.v1.keras.backend.get_session() as sess:
y_pred = sess.run(model(data))
此版本需要几个步骤(然后失败),并且非常慢(推理需要2秒钟才能完成,需要5毫秒)。
另一个版本:
with tf.compat.v1.keras.backend.get_session() as sess:
y_pred = model.predict(data)
这无法说明对模型的输入具有形状(1,)
。但事实并非如此。输入声音具有应有的形状(30700,)
。
我的预处理功能如下:
def preprocess_fn(sound):
spectrogram = sound_to_log_mel(sound)
spectrogram = tf.expand_dims(spectrogram, -1) # (96, 68)->(96, 68, 1)
spectrogram = tf.expand_dims(spectrogram, 0) # (96, 68, 1)->(1, 96, 68, 1)
spectrogram = tf.reshape(spectrogram, (1, 68, 96, 1))
return spectrogram
sound_to_log_mel
是使用不同Tensorflow操作的函数。