会话神经网络用于弹跳球的峰值检测和时差



为了好玩,我尝试创建一个神经网络,它可以在1.5秒内检测球连续两次反弹的时差(t2 - t1)(不考虑第三次反弹)。这个想法是,如果你有前两次反弹的时差,你可以计算初始反弹高度,通过一个物理公式。">

CNN的输入是如下图所示的频谱图。输出是一个神经元,它将输出第一次反弹和第二次反弹之间的时间差(第一次反弹t1 -第二次反弹t2)。总的来说,这个CNN有1000个样本。

前两个弹跳可以具有相同的时差,但放置在其他地方。例如,一个样品可能t2-t1 = 0.810 - -0.530 = 0.280,另一个样品可能是0.980 - -0.7 = 2.80。这在例1和例2中很清楚。

图例1

图例2

下面是完整的代码(不多): https://www.codepile.net/pile/Al51wXl6

网络结构如下:

cnn = tf.keras.models.Sequential()
cnn.add(tf.keras.layers.Conv2D(filters=32, kernel_size=5, activation='relu', input_shape=[1025, 65, 1]))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))
cnn.add(tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu'))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))
cnn.add(tf.keras.layers.Flatten())
cnn.add(tf.keras.layers.Dense(units=128, activation='relu'))
cnn.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))
cnn.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
cnn.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=30) 

输出远没有达到我所希望的精度:

Mean Absolute error is: ~0.3

所以我的问题是,我是否误解了CNN,或者为什么我的CNN不能完成这个任务。

最严重的错误

损失函数和输出单元的选择

您有一个回归任务(预测连续变量时差)。损失函数是binary_crossentropy,用于分类。必须使用"mean_squared_error"相反。

输出神经元非线性为sigmoid,用于分类(或其他应该在0.0和1.0之间饱和的东西)。建议使用linear。

最新更新