我刚开始学习机器学习,我正在构建一个简单的模型,能够预测简单的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
曲线?最好是用较少的层数。
回答:
我认为使用全连接网络,你无法获得任意长度的序列,但使用RNN似乎人们已经实现了这一点。谷歌搜索会出现许多这样的尝试,我很快找到了这个:http://goelhardik.github.io/2016/05/25/lstm-sine-wave/
RNN根据输入的历史学习序列,因此它被设计来捕捉这些类型的模式。
我猜你观察到的限制类似于进行多项式拟合。如果你增加多项式的次数,你可以更好地拟合这样的函数,但多项式只能表示固定数量的拐点,这取决于你选择的次数。你在这里的观察似乎是相同的。随着你增加层数,你增加了更多的非线性过渡。然而,在全连接网络中,你受到你选择的固定层数的限制。
RNN的工作原理不同,因为它保持一个状态,并且可以利用在序列中向前传递的状态来学习正弦波的一个周期的模式,然后基于状态信息重复该模式。