分类神经网络的可变输入

4

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

问题在于:例如,如果我跳跃一次,有时可能获取1000个数据点,但在另一次可能获取1200个数据点,这意味着输入大小不同。到目前为止,我研究过的神经网络要求输入大小固定以预测Y值,但在这种情况下却不是这样。我已经进行了一些关于如何创建具有可变大小的神经网络的研究,但还没有找到有效的方法。裁剪输入到特定大小不是好主意,因为这样会丢失数据。此外,如果只是通过添加额外的0来调整较小的测试数据集,会使模型出现偏差。有没有任何建议可以解决这个问题或更好地清理数据?


在推断过程中,您是否尝试为每个时间步获取一个标签?也就是说,您的y_train是否类似于[走,走,走,跳,跳,跳,跳,走,踢,踢,跳,跳]?其中信号段的长度是可变的,并且每个时间戳都被标记了吗? - Akshay Sehgal
嗨!所以数据将包含许多行。每一行对应一个活动,比如走路、跳跃等。每一行将包含一些不同数量的列,每一列都是一个三维列表,包含时间I时的x、y、z加速度。因此,我有每个时间间隔的加速度,而且我有多个时间间隔。我想使用这些数据来预测所做的动作。例如,如果我跑步,我可能只有10个时间间隔,而如果我跳跃,我可能会得到40个时间间隔。请让我知道这是否更有意义。 - user7020610
你能否提供一下训练数据(X和y)的小快照呢?不需要其他特征,只需要连续的特征即可。 - Akshay Sehgal
1个回答

1
你需要的是循环神经网络。我的大部分代码使用TensorFlow,但其他大多数深度学习库也提供相同的功能。RNN可以处理变长数据,广泛应用于许多领域,如语音检测(语音长度可变,无法缩短或分成较小的块)。下面是一个实现简单NN以符合你模型要求的小例子。
我们还必须使用不规则张量与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)

我已将内部模型复杂性最小化,希望您在进一步测试后能够扩展。最佳架构需要进行测试。我的建议是使用多个双向GRUs,并以几个小的稠密层结束。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接