Machine learning 学习Sin函数

Machine learning 学习Sin函数,machine-learning,neural-network,keras,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,), ac

我是机器学习新手 我正在建立一个简单的模型,能够预测简单的
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)
然后我生成一些测试数据,这些数据覆盖了我的学习数据,但也引入了一些新数据

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,人们似乎已经做到了这一点。谷歌搜索将弹出许多这样的努力,我很快发现了这一点:

RNN根据输入的历史记录来学习序列,因此它被设计用来提取这些类型的模式

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

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

可能的重复