学习Sin函数

dar*_*uby 3 machine-learning neural-network keras

我是机器学习的新手我正在构建一个能够预测简单sin功能的简单模型

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

from math import sin

xs = 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"))
..a number of layers here
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)
Run Code Online (Sandbox Code Playgroud)

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

test_xs = np.arange(-15, 45, 0.01)
test_ys = model.predict(test_xs)
plt.plot(xs, ys)
plt.plot(test_xs, test_ys)
Run Code Online (Sandbox Code Playgroud)

预测数据和学习数据如下所示.我添加的层数越多,网络能够学习的曲线就越多,但培训过程会增加.有没有办法让它预测sin任意数量的曲线?优选具有少量层. 在此输入图像描述

Dav*_*rks 6

有了一个完全连接的网络,我想你将无法获得任意长的序列,但使用RNN看起来人们已经实现了这一点.谷歌搜索会弹出很多这样的努力,我很快就找到了这个:http://goelhardik.github.io/2016/05/25/lstm-sine-wave/

RNN基于输入历史来学习序列,因此它旨在获取这些类型的模式.

我怀疑你观察到的限制类似于执行多项式拟合.如果增加多项式的次数,则可以更好地拟合这样的函数,但多项式只能表示固定数量的拐点,具体取决于您选择的程度.你在这里的观察结果是一样的.在增加图层时,添加更多非线性过渡.但是,您在完全连接的网络中选择固定数量的层作为架构.

RNN不能在相同的主体上工作,因为它保持状态并且可以利用序列中向前传递的状态来学习单个正弦波周期的模式,然后根据状态信息重复该模式.