【问题标题】:Learning a Sin function学习 Sin 函数
【发布时间】:2020-01-26 02:28:15
【问题描述】:

我是机器学习新手 我正在构建一个能够预测简单 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?最好使用少量层数。

【问题讨论】:

标签: machine-learning neural-network keras


【解决方案1】:

如果使用完全连接的网络,我猜您将无法获得任意长的序列,但使用 RNN 似乎人们已经实现了这一点。 google一搜就会弹出很多这样的努力,我很快就找到了这个:http://goelhardik.github.io/2016/05/25/lstm-sine-wave/

RNN 根据输入历史来学习序列,因此它的设计目的是识别这些类型的模式。

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

RNN 不能在相同的原理上工作,因为它维护一个状态,并且可以利用在序列中向前传递的状态来学习正弦波的单个周期的模式,然后根据状态信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2013-03-23
    • 2018-11-23
    相关资源
    最近更新 更多