Python 为什么我的神经网络在反向传播后会给出正确的输出,而不是';新的投入?

Python 为什么我的神经网络在反向传播后会给出正确的输出,而不是';新的投入?,python,numpy,math,neural-network,sigmoid,Python,Numpy,Math,Neural Network,Sigmoid,我一直在尝试神经网络,下面是一个简单的例子,如果数字是奇数,使用一个sigmoid函数输出1(或一个非常接近的数字),如果数字是偶数,则输出0。训练神经网络后,输出是正确的。当引入新值时,输出为零。为什么输出为零 import numpy as np inputs = np.array([9, 45, 62, 87, 88, 49]) outputs = np.array([1, 1, 0, 1, 0, 1]) # 1 for odd 0 for even weights = np.rand

我一直在尝试神经网络,下面是一个简单的例子,如果数字是奇数,使用一个sigmoid函数输出1(或一个非常接近的数字),如果数字是偶数,则输出0。训练神经网络后,输出是正确的。当引入新值时,输出为零。为什么输出为零

import numpy as np

inputs = np.array([9, 45, 62, 87, 88, 49]) 
outputs = np.array([1, 1, 0, 1, 0, 1]) # 1 for odd 0 for even
weights = np.random.random(()) # weights are initialized as random.
lr = 0.1 # learning rate

mw  = np.dot(inputs, weights)

def sigmoid(x, deriv=False):
  if deriv == True:
    return sigmoid(x) * (1 - sigmoid(x)) # derivative of sigmoid 
  else:
    return 1 / (1 + np.exp(-x))

z = sigmoid(mw)
print("Results before training: {}".format(z)) 
# Results before backpropagation with random value as weight


for x in range(20000): # training loop
  error = (z - outputs)
  adjustments = sigmoid(z, deriv=True) * error * inputs
  weights = weights - lr * adjustments 
# readjusting the weights to minimize error

# After the training loop with the readjusted weights

new_mw = (weights * inputs)  
new_z = sigmoid(new_mw) # sigmoid of new weights * input
print("New results after training:{}".format(new_z)) # -> [1, 1, 0, 1, 0, 1]

def think(x, weights):
    print("New situation: {}".format(x))
    xw = np.dot(x, weights)
    print("New results after thinking: {}".format(sigmoid(xw)))


x = np.array([2, 4, 6, 7, 17, 53]) #array of new test data


think(x, weights) # -> 0.0
不可能的解决方案 如果数字是奇数,则函数不能输出1(或非常接近的数字),如果数字是偶数,则函数不能输出0,这是不可能的权重(至少在代码中是单权重)

在训练过程中,它学习到一种关系,对于大的数字,它应该输出接近1的值,对于小的数字,它应该输出接近0的值,这似乎是合理的,因为这可能是它使用单个乘法权重所能做到的最好的结果。看看你的训练数据,边界可能在50或60左右,这会导致你所有的测试样本都是0,因为它们很小——但是你可以(也许应该!)为你学习的函数的所有值画一个图表,比如说,从1到100来说明这一点

值得花点时间思考一下,为什么你相信(d)
f(x)=sigmoid(x*[可训练权重])
中的某些权重会产生一个区分偶数和奇数的函数。如果这不明显,绘制学习函数可能会提供信息。

不可能的解决方案 如果数字是奇数,则函数不能输出1(或非常接近的数字),如果数字是偶数,则函数不能输出0,这是不可能的权重(至少在代码中是单权重)

在训练过程中,它学习到一种关系,对于大的数字,它应该输出接近1的值,对于小的数字,它应该输出接近0的值,这似乎是合理的,因为这可能是它使用单个乘法权重所能做到的最好的结果。看看你的训练数据,边界可能在50或60左右,这会导致你所有的测试样本都是0,因为它们很小——但是你可以(也许应该!)为你学习的函数的所有值画一个图表,比如说,从1到100来说明这一点


值得花点时间思考一下,为什么你相信(d)
f(x)=sigmoid(x*[可训练权重])
中的某些权重会产生一个区分偶数和奇数的函数。如果这不明显,绘制所学函数可能会提供信息。

Hi@Practical1,请在代码中添加一些注释。如果您不为代码的错误提供一些指导,将很难帮助您。谢谢。如果可能的话,只需问一个问题,SO社区会在这里给你一个正确方向的提示。其余的工作需要由您来完成;)@AndyK我添加了其他评论,并简化了我的问题:您好@Practical1,请对您的代码发表一些评论。如果您不为代码的错误提供一些指导,将很难帮助您。谢谢。如果可能的话,只需问一个问题,SO社区会在这里给你一个正确方向的提示。其余的工作需要由您来完成;)@AndyK我添加了其他评论,并简化了我的问题:如果我理解正确的话,你的意思是没有一个重量可以给我想要的输出。换句话说,一个具有更多层的神经网络,即多个权重的神经网络可以工作,对吗?@Practical1是和否。根据通用逼近器定理,给定任意多个神经元,你“应该”有一些解,但这个特定任务真的,真的不适合多层感知器之类的东西-最多,你可以在一个有界的范围内得到类似分段线性近似的结果,而这个结果不会超出这个范围。为此,你需要在某个地方输入一些周期函数的输入,比如sin或cos,以使其可行。如果我理解正确,你暗示的是没有一个权重可以给我期望的输出。换句话说,一个具有更多层的神经网络,即多个权重的神经网络可以工作,对吗?@Practical1是和否。根据通用逼近器定理,给定任意多个神经元,你“应该”有一些解,但这个特定任务真的,真的不适合多层感知器之类的东西-最多,你可以在一个有界的范围内得到类似分段线性近似的结果,而这个结果不会超出这个范围。为此,您需要输入一些周期函数的输入,比如sin或cos,以使其可行。