Tensorflow预处理作为Keras模型的输入

时间:2019-08-03 17:40:31

标签: python tensorflow keras

我已经用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操作的函数。

0 个答案:

没有答案