接近正弦函数与神经网络(Approximating the sine function with a

2019-07-05 10:40发布

为了便于学习,我实现了一个简单的神经网络架构只支持多层感知和简单的反向传播。 它的工作原理好十岁上下的线性分类,而通常的XOR问题,但对于正弦函数近似的结果并不令人满意说。

基本上,我试图接近正弦函数的一个周期由6-10元的一个隐藏层。 该网络使用双曲正切作为隐藏层的激活功能和用于输出的线性函数。 结果仍然是正弦波的相当粗略的估计,需要长时间来计算。

我看着encog参考,但即使有,我不能把它简单的反向传播的工作(通过切换到弹性传播它开始变得更好,但仍比所提供的超光滑[R脚本的方式更糟在这种类似的问题 )。 所以我其实我试图做的东西是不可能的? 这难道不是可以近似用简单的反向传播(没有动力,没有动力学习速率)正弦波? 什么是R中的神经网络库实际使用的方法是什么?

编辑 :我知道这是绝对有可能找到一个足够好的近似,即使简单的反向传播(如果你与你的初始权重非常幸运),但其实我更想知道这是否是一个可行的办法。 我挂到R脚本似乎只是汇聚,以令人难以置信的快速和稳健(在40个时代与只有少数学习样本)相比,我的执行,甚至encog的弹性传播。 我只是想知道,如果有什么东西我可以做些什么来改善我的BP算法来获取相同的性能或做我必须考虑一些更高级的学习方法?

Answer 1:

这可以通过使用现代框架像TensorFlow神经网络可以比较容易地实现。

例如,使用每层火车100元在我的电脑上几秒钟,两层的神经网络提供了一个很好的近似:

代码也很简单:

import tensorflow as tf
import numpy as np

with tf.name_scope('placeholders'):
    x = tf.placeholder('float', [None, 1])
    y = tf.placeholder('float', [None, 1])

with tf.name_scope('neural_network'):
    x1 = tf.contrib.layers.fully_connected(x, 100)
    x2 = tf.contrib.layers.fully_connected(x1, 100)
    result = tf.contrib.layers.fully_connected(x2, 1,
                                               activation_fn=None)

    loss = tf.nn.l2_loss(result - y)

with tf.name_scope('optimizer'):
    train_op = tf.train.AdamOptimizer().minimize(loss)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    # Train the network
    for i in range(10000):
        xpts = np.random.rand(100) * 10
        ypts = np.sin(xpts)

        _, loss_result = sess.run([train_op, loss],
                                  feed_dict={x: xpts[:, None],
                                             y: ypts[:, None]})

        print('iteration {}, loss={}'.format(i, loss_result))


Answer 2:

你绝对不会想的是不可能的。 神经网络是通用逼近 -这意味着对于任何函数F和误差E,存在可与比E.少误差近似于˚F 一些神经网络(仅需要单个隐藏层)

当然,发现(那些)(多个)网络是一个完全不同的问题。 我可以告诉你最好是试错......这里是基本过程:

  1. 将数据分成两个部分:训练集(〜2/3)和测试组(〜1/3)。
  2. 火车上的所有训练集中的项目您的网络。
  3. 测试(但不训练)对测试集的所有项目您的网络,并记录平均误差。
  4. 重复步骤2和3,直到您已达到最低检测误差(这种情况与“过拟合”当你的网络开始变得在训练数据,一切有损超好),或者直到你的整体误差不再显着下降(这意味着网络的好,因为它会得到)。
  5. 如果在这一点上,误差是可以接受的低,你就大功告成了。 如果没有,你的网络是不够的复杂处理你训练它的功能; 添加更多的隐藏神经元,然后回到开始......

有时候,改变你的激活功能可以有所作为,太(只是不使用线性的,因为它否定了增加更多层的功率)。 但同样,这将是试错,看看有什么效果最好。

希望帮助(和抱歉,我不能更实用)!

PS:我也知道这是可能的,因为我已经看到有人近似的正弦与网络。 我想她是不是利用S形激活函数的说法,但我不能保证那算不算我的记忆......



文章来源: Approximating the sine function with a neural network