- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
为了学习 Keras LSTM 和 RNN,我想创建一个简单的问题来解决:给定一个正弦波,我们可以预测它的频率吗?
我不希望一个简单的神经网络能够预测频率,因为时间的概念在这里很重要。然而,即使使用 LSTM,我也无法学习频率;我能够学习一个平凡的零作为估计频率(即使对于火车样本)。
这是创建训练集的代码。
import numpy as np
import matplotlib.pyplot as plt
def create_sine(frequency):
return np.sin(frequency*np.linspace(0, 2*np.pi, 2000))
train_x = np.array([create_sine(x) for x in range(1, 300)])
train_y = list(range(1, 300))
现在,这是一个用于此示例的简单神经网络。
from keras.models import Model
from keras.layers import Dense, Input, LSTM
input_series = Input(shape=(2000,),name='Input')
dense_1 = Dense(100)(input_series)
pred = Dense(1, activation='relu')(dense_1)
model = Model(input_series, pred)
model.compile('adam','mean_absolute_error')
model.fit(train_x[:100], train_y[:100], epochs=100)
正如预期的那样,这个神经网络没有学到任何有用的东西。接下来,我尝试了一个简单的 LSTM 示例。
input_series = Input(shape=(2000,1),name='Input')
lstm = LSTM(100)(input_series)
pred = Dense(1, activation='relu')(lstm)
model = Model(input_series, pred)
model.compile('adam','mean_absolute_error')
model.fit(train_x[:100].reshape(100, 2000, 1), train_y[:100], epochs=100)
但是,这个基于 LSTM 的模型也没有学到任何有用的东西。
最佳答案
您认为训练 RNN 是一个简单的问题,但实际上您的网络设置并不容易:
如前所述,缺少重要样本。你把那么多数据丢进去(300 * 2000 点),但实际目标(频率)只被网络看到一次。即使网络确实学到了一些东西,它也很有可能会过度拟合。
数据不一致。请记住,RNN 擅长捕捉系列数据中的相似模式。例如,在 NLP 中,语料库中的所有句子都受相同的语言规则约束,更多的句子有助于 RNN 更好地理解这些规则,即,更多的数据有助于。
在您的情况下,具有不同频率的系列不太相似:将正弦与 frequency=1
和 frequency=100
进行比较。数据的这种多样性使学习变得更难,而不是更容易。这并不意味着 RNN 无法学习频率,它只是意味着您不应该对像您这样的微不足道的 RNN 很难学习感到惊讶。
数据规模。将频率从 1 更改为 300,将 x
和 y
的比例更改两个数量级,这对任何神经网络都可能存在问题。
由于您的目标很有教育意义,我通过将目标频率限制为 10 简单地解决了第二项和第三项,因此缩放和分布多样性不是什么大问题(欢迎您在这里尝试不同的值:您应该看到将这个参数增加到 50 会使任务复杂得多)。
第一项的解决方法是为 RNN 提供每个频率的 10 个示例,而不是一个。我还添加了一个隐藏层以增加网络灵 active ,以及一个简单的正则化器(Dropout
层)。
完整代码:
import numpy as np
from keras.models import Model
from keras.layers import Input, Dense, Dropout, LSTM
max_freq = 10
time_steps = 100
def create_sine(frequency, offset):
return np.sin(frequency * np.linspace(offset, 2 * np.pi + offset, time_steps))
train_y = list(range(1, max_freq)) * 10
train_x = np.array([create_sine(freq, np.random.uniform(0,1)) for freq in train_y])
train_y = np.array(train_y)
input_series = Input(shape=(time_steps, 1), name='Input')
lstm = LSTM(units=100)(input_series)
hidden = Dense(units=100, activation='relu')(lstm)
dropout = Dropout(rate=0.1)(hidden)
output = Dense(units=1, activation='relu')(dropout)
model = Model(input_series, output)
model.compile('adam', 'mean_squared_error')
model.fit(train_x.reshape(-1, time_steps, 1), train_y, epochs=200)
# Trying the network on the same data
test_x = train_x.reshape(-1, time_steps, 1)
test_y = train_y
predicted = model.predict(test_x).reshape([-1])
print()
print((predicted - train_y)[:12])
print(np.mean(np.abs(predicted - train_y)))
输出:
max_freq=10
[-0.05612183 -0.01982236 -0.03744316 -0.02568841 -0.11959982 -0.0770483
0.04643679 0.12057972 -0.00625324 -0.00724655 -0.16919005 -0.04512954]
0.0503574344847
max_freq=20(其他都一样)
[ 0.51365542 0.09269333 -0.009691 0.0619092 0.09852839 0.04378462
0.01430321 -0.01953268 0.00722599 0.02558327 -0.04520988 -0.0614748 ]
0.146024380232
max_freq=30(其他都一样)
[-0.28205156 -0.28922796 -0.00569081 -0.21314907 0.1068716 0.23497915
0.23975039 0.25955486 0.26333141 0.24235058 0.08320332 -0.03686047]
0.406703719805
请注意,结果是随机的,实际上增加 max_freq
会增加 divergence 的变化。但即使它收敛了,尽管有更多的数据,性能也没有提高,反而变得更糟,而且速度非常快。
关于python - 神经网络 : estimating sine wave frequency,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47932589/
我想修复我网站上 WAVE 工具中的错误:http://human2.com.pl/错误是: [网址= https://gifyu.com/image/sUbw][img]https://s1.gif
波浪是否仅限于共享文本信息 (HTML),或者我是否正确地假设波浪可以包含任意数据(以 XML 表示),只要它还包含以有意义的方式呈现它所需的 javascript? 我问是因为Google I/O视
我的理解是 Google wave 是一种通信和协作工具。但它仅限于 IM/Twitter 类型的界面还是可以做得更多?它可以是与自上而下的对话格式完全不同的东西吗? 假设我想使用 google wa
如何链接到 Google Wave,例如在网站或电子邮件中,例如 Hey, just have a look to this new Wave I created. ,在哪里???正是我要找的。 最佳
有没有办法部署使用 H2O wave 创建的应用程序? 我最近制作了一个数据可视化应用程序,希望人们能够快速轻松地演示它。 我试过关注这个话题:Deploy H2O Wave application
Google Wave 中使用的操作转换 Material 具有相当奇特的文档格式。文档基本上只是一个 xml 子集文档 - 字符、开始标签和结束标签。除此之外,文档还有“注释”,它们是与范围相关的元
我想知道是否有可用的工具/框架支持在 Google Wave 之外测试 Google Wave 小工具。 我知道这两个模拟器(1 和 2),但我仍然必须为每次调试运行上传我的小工具。 我正在寻找一种工
我真的是编程新手,所以你们的任何帮助都会很有帮助,我将非常感激。顺便说一下,这是 C++。我有一个 wave 文件,我成功地读取了它的标题。我想创建另一个 wave 文件,将第一个 wave 文件的所
我有一个原始立体声音频文件。 它是树莓派上噪声消除系统的一部分,麦克风 1 将主要声音记录到左声道,麦克风 2 将周围的噪音记录到右声道。目标是从左 channel 中减去右 channel 。我将写
我正在尝试学习一些有关音频编程的知识,因此我决定看看是否可以弄清楚如何生成正弦波并将其写入 .wav 文件。来自引用 here ,我认为每个 channel 只是在文件末尾的数据 block 中交错。
接收错误在 @waves/waves-crypto 中找不到 crypto-js。我尝试通过 npm 卸载并重新安装模块,并使用 *wavesCrypto 导入模块,但模块本身文件 index.d.t
我正在寻找一种方法,可以使用 python 将多个 wave 文件组合成一个 wave 文件并在 linux 上运行它。除了默认的 shell 命令行和默认的 python 模块之外,我不想使用任何附
这让我头疼了一天,但既然我已经弄明白了,我想把它贴在某个地方以防它有帮助。 我正在使用 python 的 wave 模块将数据写入 wave 文件。我没有使用 scipy.io.wavfile,因为数
此代码生成的 WAV 文件在许多应用程序中不起作用。 当我 checkin RIFFVIEWER 应用程序时,它提示 RIFF 长度无效。 BWFMetaEdit 声称文件已被截断。一些宽容的应用程序
(在我问我的问题之前;我真的不知道是否有人可以回答我的问题,因为 Z-wave 协议(protocol)应该是 secret 信息,但如果它确实违反了任何类型的法规,那么我会觉得免费删除此帖子。) 我
数字声音正在使用DirectSound设备播放。像模拟设备一样,必须以分贝显示声音事件。 从WAVE PCM数据(44100 Hz,16位)计算声压的正确方法是什么? 最佳答案 如果您只需要一个“理想
我一直在研究试图理解声音和正弦波的工作方式,尤其是和弦。到目前为止,我的理解如下: b(t) = sin(Api(t)) 是频率为 A 的和弦的基音。 T(t) = sin(5/4piA(t)) 是基
img{ width: 150px; height:150px; float:left; } var img = undefined, section = documen
我想“设计”google wave 并在我的博客/网站上试用它?是否可以修改 Google Wave 的源代码?它在哪里可用? 有没有人做过这样的事情? 最佳答案 如前所述,您可能想要 embed a
所以基本上我试图读取波形文件的信息,以便我可以获取字节信息并创建时间->幅度点的数组。 import wave class WaveFile: # `filename` is the name
我是一名优秀的程序员,十分优秀!