如何使用tensorflow部署触发字检测

如何使用tensorflow部署触发字检测,tensorflow,keras,lstm,recurrent-neural-network,Tensorflow,Keras,Lstm,Recurrent Neural Network,我正在研究“触发词检测”模型,我决定将该模型部署到我的手机上 模型的输入形状是(无,5511101)。 输出形状为(无,1375,1) 但在实际部署的应用程序中,该模型无法一次获得5511个时间步长,而是手机传感器产生的音频帧是一个接一个的 我如何将这些数据一个接一个地提供给模型,并在每个时间步获得输出 该模型是一个循环模型。但是“model.predict()”的第一个参数是(None,5511101),我打算做的是 output = [] for i in range(5511):

我正在研究“触发词检测”模型,我决定将该模型部署到我的手机上

模型的输入形状是
(无,5511101)
。 输出形状为
(无,1375,1)

但在实际部署的应用程序中,该模型无法一次获得5511个时间步长,而是手机传感器产生的音频帧是一个接一个的

我如何将这些数据一个接一个地提供给模型,并在每个时间步获得输出


该模型是一个循环模型。但是“model.predict()”的第一个参数是(None,5511101),我打算做的是

output = []
for i in range(5511): 
    a = model.func(i, (None,1,101))
    output.append(a)
模型的结构:


您应该在一个重复的模型中更改您的模型,在该模型中您可以一次一个地提供数据块,或者您应该考虑更改模型,并使用在时间窗口(重叠)上工作的东西,在时间窗口中,您每隔几块数据应用模型并获得部分输出

仍然取决于模型,您可能只在最后得到您想要的输出。你应该相应地设计它


这里有一个例子:

您应该在一个循环的模型中更改您的模型,您可以一次一个地提供数据块,或者您应该考虑更改模型,并使用在时间窗口上工作(重叠)的东西,在时间窗口中,您每隔几块数据应用一个模型并获得部分输出

仍然取决于模型,您可能只在最后得到您想要的输出。你应该相应地设计它


下面是一个示例:

通过使时间步长轴动态化,可以解决此问题。换句话说,定义模型时,时间步数应设置为
None
。下面是一个示例,说明了它如何适用于模型的简化版本:

from keras.layers import GRU, Input, Conv1D
from keras.models import Model
import numpy as np

x = Input(shape=(None, 101))
h = Conv1D(196, 15, strides=4)(x)
h = GRU(1, return_sequences=True)(h)
model = Model(x, h)


# The model works for the original number of timesteps (5511)
batch_size = 2
out = model.predict(np.random.rand(batch_size, 5511, 101))
print(out.shape)


# ... but also for fewer timesteps (say 32)
out = model.predict(np.random.rand(batch_size, 32, 101))
print(out.shape)


# However, it will not work if timesteps < Conv1D filter_size (15)!
out = model.predict(np.random.rand(batch_size, 14, 101))
print(out.shape)
从keras.layers导入GRU、输入、Conv1D
从keras.models导入模型
将numpy作为np导入
x=输入(形状=(无,101))
h=Conv1D(196,15,步幅=4)(x)
h=GRU(1,返回序列=True)(h)
模型=模型(x,h)
#该模型适用于原始时间步数(5511)
批量大小=2
out=模型预测(np.random.rand(批量,5511101))
打印(输出形状)
# ... 但也可以减少时间步长(例如32)
out=模型预测(np.random.rand(批次大小,32101))
打印(输出形状)
#但是,如果时间步长

但是,请注意,除非将输入序列填充到15,否则无法馈送少于15个时间步(Conv1D过滤器的维度)。此问题可以通过使时间步轴动态来解决。换句话说,定义模型时,时间步数应设置为
None
。下面是一个示例,说明了它如何适用于模型的简化版本:

from keras.layers import GRU, Input, Conv1D
from keras.models import Model
import numpy as np

x = Input(shape=(None, 101))
h = Conv1D(196, 15, strides=4)(x)
h = GRU(1, return_sequences=True)(h)
model = Model(x, h)


# The model works for the original number of timesteps (5511)
batch_size = 2
out = model.predict(np.random.rand(batch_size, 5511, 101))
print(out.shape)


# ... but also for fewer timesteps (say 32)
out = model.predict(np.random.rand(batch_size, 32, 101))
print(out.shape)


# However, it will not work if timesteps < Conv1D filter_size (15)!
out = model.predict(np.random.rand(batch_size, 14, 101))
print(out.shape)
从keras.layers导入GRU、输入、Conv1D
从keras.models导入模型
将numpy作为np导入
x=输入(形状=(无,101))
h=Conv1D(196,15,步幅=4)(x)
h=GRU(1,返回序列=True)(h)
模型=模型(x,h)
#该模型适用于原始时间步数(5511)
批量大小=2
out=模型预测(np.random.rand(批量,5511101))
打印(输出形状)
# ... 但也可以减少时间步长(例如32)
out=模型预测(np.random.rand(批次大小,32101))
打印(输出形状)
#但是,如果时间步长

但是,请注意,除非将输入序列填充到15,否则您将无法输入少于15个时间步(Conv1D筛选器的维度)。

对于逐步传递输入,您需要具有
stateful=True
的重复层

卷积层肯定会阻止你实现你想要的。要么删除它,要么以15步为一组传递输入(其中15是卷积的内核大小)

您需要将这15步与第4步协调,并且可能需要填充。如果我可以建议,为了避免数学上的困难,您可以使用
kernel\u size=16
stride=4
input\u steps=5512
,这是您的步长值
4
的倍数。(这将避免填充,并允许更简单的计算),您的输出步骤将是1375个完美的四舍五入

那么你的模型会是这样的:

inputs = Input(batch_shape=(batch_size,None, 101)) #where you will always use input shapes of (batch_size, 16, 101)
out = Conv1D(196, 16, strides=4)(inputs)
...
...
out = GRU(..., stateful=True)(out)
...
out = GRU(..., stateful=True)(out)
...
...

model = Model(inputs, out)
对于
stateful=True
模型,必须有一个固定的批量大小。它可以是1,但为了优化处理速度,如果要并行处理多个序列(并且彼此独立),请使用更大的批处理大小

为了一步一步地工作,首先需要重置状态(每当使用
stateful=True
模型时,每次输入新序列或新批并行序列时都需要保持重置状态)

因此:


为了一步一步地传递输入,需要使用
stateful=True
的循环层

卷积层肯定会阻止你实现你想要的。要么删除它,要么以15步为一组传递输入(其中15是卷积的内核大小)

您需要将这15步与第4步协调,并且可能需要填充。如果我可以建议,为了避免数学上的困难,您可以使用
kernel\u size=16
stride=4
input\u steps=5512
,这是您的步长值
4
的倍数。(这将避免填充,并允许更简单的计算),您的输出步骤将是1375个完美的四舍五入

那么你的模型会是这样的:

inputs = Input(batch_shape=(batch_size,None, 101)) #where you will always use input shapes of (batch_size, 16, 101)
out = Conv1D(196, 16, strides=4)(inputs)
...
...
out = GRU(..., stateful=True)(out)
...
out = GRU(..., stateful=True)(out)
...
...

model = Model(inputs, out)
对于
stateful=True
模型,必须有一个固定的批量大小。它可以是1,但为了优化处理速度,如果要并行处理多个序列(