分类神经网络的变量输入

Variable Input for a classification neural network

我目前正在做一个项目,我在鞋子里有一个传感器,它记录来自加速度和陀螺仪传感器的 XYZ。每毫秒我得到 6 个数据点。现在的目标是,如果我做了一个动作,比如跳跃或踢腿,我会使用传感器的输出来预测正在完成的动作。

问题来了:如果我跳,例如,一次我可能得到 1000 个数据点,但在另一次我得到 1200 个数据点,这意味着输入的大小不同。到目前为止,我研究过的神经网络要求输入大小保持不变才能预测 Y 值,但在这种情况下,情况并非如此。我已经对如何制作可变大小的神经网络进行了一些研究,但一直未能找到可行的方法。将输入裁剪到一定大小不是一个好主意,因为那样我就会丢失数据。此外,如果我只是通过放置额外的 0 来调整较小试验的大小,它会扭曲模型。关于可行的模型或如何更好地清理数据有什么建议吗?

你需要的是RNNs。我的大部分代码都使用 TensorFlow,但在大多数其他 DL 库中也可以使用。 RNN 可以处理可变长度的数据,并用于许多事情,例如语音检测。 (语音可以是可变长度的,就像你说的,我们不能缩短它或将它分成更小的盒子)。下面是一个实现符合您的模型要求的简单神经网络的小示例。

我们还必须将 ragged tensors 与 RNN 一起用于您的任务。顾名思义,参差不齐的张量具有可变的内部形状,非常适合表示持续时间可变的情况。

import tensorflow as tf
import numpy as np


x = []
# Your action sequences stored as one-hot encoding.
y = tf.one_hot(np.array([np.random.randint(0, 4) for _ in range(100)]), 5)
# Your input data, each row is a np array of shape (random value between 600 and 1200, 5)
for i in range(100):
    temp = np.random.randint(600, 1200)
    x.append(np.random.rand(temp, 5))

x = tf.ragged.constant(x)

keras_model = tf.keras.Sequential([
    tf.keras.layers.Input(shape=[None, 5], dtype=tf.float64, ragged=True),
    tf.keras.layers.LSTM(32),
    tf.keras.layers.Dense(32),
    tf.keras.layers.Activation(tf.nn.relu),
    tf.keras.layers.Dense(5)
])

keras_model.compile(optimizer='rmsprop', loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True))
keras_model.fit(x, y, epochs=100)

我已将内部模型的复杂性保持在最低水平,我希望通过进一步的测试您可以扩展它。最好的架构需要测试。我的建议是使用多个 Bidirectional GRUs 并以几个小的密集层结束。