学习正弦函数

我刚开始学习机器学习,我正在构建一个简单的模型,能够预测简单的sin函数

我生成了一些sin值,并将它们输入到我的模型中。

from math import sinxs = np.arange(-10, 40, 0.1)squarer = lambda t: sin(t)vfunc = np.vectorize(squarer)ys = vfunc(xs)model= Sequential()model.add(Dense(units=256, input_shape=(1,), activation="tanh"))model.add(Dense(units=256, activation="tanh"))..这里有若干层model.add(Dense(units=256, activation="tanh"))model.add(Dense(units=1))model.compile(optimizer="sgd", loss="mse")model.fit(xs, ys, epochs=500, verbose=0)

然后我生成了一些测试数据,这些数据覆盖了我的学习数据,同时也引入了新的数据

test_xs = np.arange(-15, 45, 0.01)test_ys = model.predict(test_xs)plt.plot(xs, ys)plt.plot(test_xs, test_ys)

预测数据和学习数据如下图所示。我添加的层数越多,网络能够学习的曲线就越多,但训练过程也会增加。有没有办法让它预测任意数量的sin曲线?最好是用较少的层数。enter image description here


回答:

我认为使用全连接网络,你无法获得任意长度的序列,但使用RNN似乎人们已经实现了这一点。谷歌搜索会出现许多这样的尝试,我很快找到了这个:http://goelhardik.github.io/2016/05/25/lstm-sine-wave/

RNN根据输入的历史学习序列,因此它被设计来捕捉这些类型的模式。

我猜你观察到的限制类似于进行多项式拟合。如果你增加多项式的次数,你可以更好地拟合这样的函数,但多项式只能表示固定数量的拐点,这取决于你选择的次数。你在这里的观察似乎是相同的。随着你增加层数,你增加了更多的非线性过渡。然而,在全连接网络中,你受到你选择的固定层数的限制。

RNN的工作原理不同,因为它保持一个状态,并且可以利用在序列中向前传递的状态来学习正弦波的一个周期的模式,然后基于状态信息重复该模式。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注