基于CNN的弹跳球峰值检测与弹跳时间差计算模型效果不佳问询
精度不达标的核心原因及优化方案
1. 任务类型与模型配置完全不匹配
你要预测的两次弹跳时间差是连续数值,属于回归任务,但你现在的配置是二分类任务的标准配置:
- 输出层用
sigmoid激活会强制把输出压缩到0~1区间,限制了回归结果的表达范围 - 损失函数用
binary_crossentropy(二元交叉熵)是用来计算分类概率的交叉熵损失,完全不适合衡量连续数值的预测误差 - 评估指标用
accuracy(准确率)是分类任务指标,对回归任务没有参考意义
修正后的网络配置参考:
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,1), strides=(2,1))) # 仅在频率维度做池化,保留时间维度分辨率 cnn.add(tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu')) cnn.add(tf.keras.layers.MaxPool2D(pool_size=(2,1), strides=(2,1))) cnn.add(tf.keras.layers.Flatten()) cnn.add(tf.keras.layers.Dense(units=128, activation='relu')) cnn.add(tf.keras.layers.Dense(units=1)) # 回归任务输出层用线性激活,无需额外激活函数 cnn.compile(optimizer = 'adam', loss = 'mae', metrics = ['mae', 'mse']) # 替换为回归任务对应的损失和评估指标 cnn.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=30)
2. 样本量不足且缺少适配的数据增强
1000个样本对于输入尺寸为1025*65的CNN来说数量过少,很容易出现拟合不充分或者过拟合。结合你的任务中两次弹跳的绝对出现时间不影响最终结果,可以做以下数据增强扩充有效样本量:
- 给声谱图添加随机时间偏移
- 加入少量高斯噪声
- 对时间维度做微小裁剪/填充
以此提升模型泛化能力。
3. 特征提取逻辑适配问题
你原有的池化操作对频率、时间两个维度做了等比例压缩,会丢失时间维度的精细信息,而你要计算的时间差高度依赖时间维度的分辨率,调整池化策略仅在频率维度做压缩,能更好地保留时间维度的信息即可解决该问题。
内容的提问来源于stack exchange,提问作者Max Clark
相关产品推荐
相关产品推荐

