找到信号的基频
Posted
技术标签:
【中文标题】找到信号的基频【英文标题】:Find fundamental frequency of signal 【发布时间】:2019-03-13 10:18:29 【问题描述】:我有 1000 个数据集,每个数据集都包含 8000 个信号幅度和一个标签 - 该信号的基频。构建神经网络以预测新提供的信号的基频的最佳方法是什么?
例如:
基频:75.88206932 Hz
数据片段:
-9.609272558949627507e-02
-4.778297441391140543e-01
-2.434520972570237696e-01
-1.567176020112603263e+00
-1.020037056101358752e+00
-1.129608807811322446e+00
4.303651786855859918e-01
-3.936956061582048694e-01
-1.224883726737033163e+00
-1.776803300708089672e+00
我创建的模型:(训练集形状:(600,8000,1)
)
model=Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='tanh', \
input_shape=(data.shape[1],data.shape[2])))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(filters=64, kernel_size=3, activation='tanh'))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(filters=64, kernel_size=3, activation='tanh'))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(500, activation='tanh'))
model.add(Dropout(0.2))
model.add(Dense(50, activation='tanh'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='linear'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=["accuracy"])
但模型不想训练。准确度~ 0.0
。
我很感激任何建议。
【问题讨论】:
@desertnaut 谢谢你的评论。我已经更新了问题。 干得好 - 否决票撤回 ;) 【参考方案1】:构建神经网络进行预测的最佳方法是什么 新提供的信号的基频?
这对于 SO 来说是一个过于宽泛的问题,因此您不应该期待任何足够详细且有意义的答案。
也就是说,您的代码存在某些问题,纠正这些问题可能会让您更接近实现最终目标。
所以,你犯了一个非常根本性的错误:
准确度只适用于分类问题;对于回归(即数字预测),例如您的,准确性毫无意义。
更重要的是,不幸的是,Keras 不会“保护”您或任何其他用户免于在您的代码中放置此类无意义的请求,即您不会收到任何错误,甚至不会收到警告,表明您正在尝试执行以下操作没有意义,例如在回归设置中要求准确性;有关更多详细信息和实际演示,请参阅我在 What function defines accuracy in Keras when the loss is mean squared error (MSE)? 中的回答。
因此,您的性能指标实际上与您的损失相同,即均方误差 (MSE);您应该尽量减少验证集中的这个数量,并从模型编译中完全删除 metrics=['accuracy']
参数。
此外,现在我们几乎从不使用tanh
激活隐藏层;你应该改用relu
。
【讨论】:
你的回答让我意识到我必须回到基金会,谢谢。但是我怎么知道我的模型是否足够好?例如在分类问题中准确率在 [0,1] 范围内,其中 1.0 是完美的准确率,在回归问题中我可以使用 RMSE 作为度量,完美的当然等于 0.0,但它没有上限。那么如何应对呢? @Alexandra 不客气。这确实是回归模型的一个问题,并且没有现成的方法。绘制预测值与实际值,以及计算因差异而产生的任何实际成本是最初的方法......【参考方案2】:您可以先对数据进行 FFT,无论有无窗口,然后将 FFT 幅度向量用作 ML 训练数据向量。
【讨论】:
以上是关于找到信号的基频的主要内容,如果未能解决你的问题,请参考以下文章