用神经网络逼近多维函数

时间:2018-01-29 11:18:53

标签: tensorflow neural-network keras

是否可以使用神经网络拟合或近似多维函数?

假设我想从某些给定的测量数据中建模函数f(x,y)= sin(x)+ y。 (f(x,y)被认为是基础事实并且未知)。此外,如果可能的话,一些用Tensorflow或Keras编写的代码示例会很棒。

function plot of f(x,y)=sin(x)+y

1 个答案:

答案 0 :(得分:1)

正如@AndreHolzner所说,theoretically you can approximate any continuous function具有神经网络以及你想要的R^n的任何紧凑子集,即使只有一个隐藏层。

然而,在实践中,神经网络对于某些功能可能必须非常大,并且有时是无法处理的(如果没有达到局部最小值,则可能很难找到最佳权重)。所以这里有一些实用的建议(不幸的是模糊不清,因为细节过多地依赖于您的数据而且没有多次尝试就很难预测):

  • 保持网络不要太大(不幸的是,很难定义):你只是过度配备。您可能需要大量的训练样本。
  • 大量合理大小的图层通常比合理数量的大图层好。
  • 如果您对该功能有一些先验,请使用它们:例如,如果您认为f中存在某种周期性(如您的示例中,但可能更复杂),则可以添加sin()函数到第一层的一些输出(不是全部,这将给你一个真正的周期性输出)。如果您怀疑某个度为n的多项式,只需使用x,... 增加输入x^n,并对该输入使用线性回归等。比学习重量容易得多。
  • 通用逼近定理在R^n的任何紧致子集上都是正确的,而不是在整个多维空间上。特别是,您永远无法预测输入的值比任何训练样本大(例如,您训练的数字从0到100,不在200上测试,它会失败)。

有关回归的示例,您可以查看here。要回归更复杂的函数,您需要使用更复杂的函数从pred获取x,例如:

  n_layers = 3
  x = tf.placeholder(shape=[-1, n_dimensions], dtype=tf.float32)
  last_layer = x

  # Add n_layers dense hidden layers
  for i in range(n_layers):
      last_layer = tf.layers.dense(inputs=last_layer, units=128, activation=tf.nn.relu)

  # Get the output prediction
  pred = tf.layers.dense(inputs=last_layer, units=1, activation=None)

  # Get the cost, training op, etc, just like in the linear regression example