Python 非线性函数的神经网络逼近

Python 非线性函数的神经网络逼近,python,neural-network,theano,Python,Neural Network,Theano,我用Theano设计了一个神经网络来逼近数学上的多重函数。但是我还不能近似非线性函数,比如:2x/x+3等,但是网络在线性函数上表现良好 我使用1个隐藏层,2个神经元。我试着增加隐藏层中的神经元。但是,这似乎并不能解决问题 注意:代码没有任何错误。它还试图最小化成本,但它所做的预测并不是预期的(也许它在学习一些无意义/不需要的模式) 我使用的(UPDATED-UPDATED)代码是: x = T.dscalar() y = T.dscalar() inputs = np.random.rand

我用Theano设计了一个神经网络来逼近数学上的多重函数。但是我还不能近似非线性函数,比如:2x/x+3等,但是网络在线性函数上表现良好

我使用1个隐藏层,2个神经元。我试着增加隐藏层中的神经元。但是,这似乎并不能解决问题

注意:代码没有任何错误。它还试图最小化成本,但它所做的预测并不是预期的(也许它在学习一些无意义/不需要的模式)

我使用的(UPDATED-UPDATED)代码是:

x = T.dscalar()
y = T.dscalar()

inputs = np.random.randint(1,6,size=(500))
outputs = (inputs * 2.0) / (inputs + 3.0)

def layer(x, w):
    b = np.array([1], dtype=theano.config.floatX)
    x = b * x    # doing to be able to concatenate b and x
    x = T.concatenate([x, b])
    return nnet.sigmoid(T.dot(w.T, x))

def grad_desc(cost, theta):
    alpha = 0.01
    return theta - (alpha * (T.grad(cost, wrt=theta)))

theta1 = theano.shared(np.array(np.random.rand(2,6), dtype=theano.config.floatX))
theta2 = theano.shared(np.array(np.random.rand(7,1), dtype=theano.config.floatX))

h1 = layer(x, theta1)
h2 = layer(h1, theta2)
out = T.nnet.softmax(h2)
fc = T.mean(T.sqr(out - y))

back_prop = theano.function(inputs=[x,y], outputs=[fc], updates=[
                (theta1, grad_desc(fc, theta1)),
                (theta2, grad_desc(fc, theta2))
            ])
feed_forward = theano.function(inputs=[x], outputs=[out])

cur_cost = 0
for i in range(100):
    for x, y in zip(inputs, outputs):
        cur_cost = back_prop(x, y)
    if i % 10 == 0:
        print "Epoch ", i/10, " : ", cur_cost
各时代的成本:

Epoch  0  :  [array(0.0625)]
Epoch  1  :  [array(0.0625)]
Epoch  2  :  [array(0.0625)]
Epoch  3  :  [array(0.0625)]
Epoch  4  :  [array(0.0625)]
Epoch  5  :  [array(0.0625)]
Epoch  6  :  [array(0.0625)]
Epoch  7  :  [array(0.0625)]
Epoch  8  :  [array(0.0625)]
Epoch  9  :  [array(0.0625)]
测试:

test_values = np.random.randint(1,100, size=(1,6))
for i in test_values[0]:
    print "Result : ", feed_forward(i), "Actual : ", (2.0*i)/(i+3.0)
测试结果:

Result :  [array([[ 1.]])] Actual :  1.90909090909
Result :  [array([[ 1.]])] Actual :  1.82857142857
Result :  [array([[ 1.]])] Actual :  1.66666666667
Result :  [array([[ 1.]])] Actual :  1.93023255814
Result :  [array([[ 1.]])] Actual :  1.7
Result :  [array([[ 1.]])] Actual :  1.85714285714

非常感谢您的帮助。

您的代码不是神经网络。。。至少不是有意义的——它只是一个线性模型。当你没有任何非线性激活函数时,有一个隐藏层是没有意义的,因为你能建模的一切都只是你输入的线性函数。添加非线性,添加它们各自的梯度,然后您将能够建模非线性函数。

根据您的建议,我使用了Sigmoid非线性(已更新代码)。但即便如此,它也没有产生预期的结果。请你们指出,我哪里做错了。接下来是缺乏可学习的偏见,你们把ot定为一个(非常奇怪的想法)。为什么要求出变量的和?作为输出,将是隐藏层中所有6个神经元的输出之和,所以我们需要求和。不,它不应该是和,它应该是线性层,因此是可训练的加权和。这段代码似乎有很多错误,因此修复所有错误可能会有问题,所以我已经做了您建议的更改-添加了可学习的偏差,在输出层添加了softmax。并试图消除歧义。但是,我还是想不出一个办法。你能看一看,并确定我是否做错了吗?