Python神经网络中出现不需要的[Nan]输出

3

我是新手,刚从JS转到Python来构建神经网络,但输出结果却是 [Nan]。

奇怪的是,我的sigmoid函数似乎没有遇到任何溢出问题,但导数却导致了混乱。

import numpy as np

def sigmoid(x):
  return x*(1-x)
  return 1/(1 + np.exp(-x))

#The function- 2

def Sigmoid_Derivative(x):
    return x * (1-x)

Training_inputs = np.array([[0,0,1], 
                            [1,1,1], 
                            [1,0,1], 
                            [0,1,1]])

Training_outputs = np.array([[0, 1, 1, 0]]).T

np.random.seed(1)

synaptic_weights = np.random.random((3, 1)) - 1

print ("Random starting synaptic weight:")
print (synaptic_weights)

for iteration in range(20000):
  Input_Layer = Training_inputs

  Outputs = sigmoid(np.dot(Input_Layer, synaptic_weights)) 

  erorr = Training_outputs - Outputs

  adjustments = erorr * Sigmoid_Derivative(Outputs)

  synaptic_weights += np.dot(Input_Layer.T, adjustments)

# The print declaration----------  
print ("Synaptic weights after trainig:")
print (synaptic_weights)

print ("Outputs after training: ")
print (Outputs)

这是错误信息。我不知道为什么会出现溢出的情况,因为权重似乎已经足够小了。顺便说一下,请使用简单的Python语言给出解决方案,因为我是个菜鸟:--

Random starting synaptic weight:
[[-0.582978  ]
 [-0.27967551]
 [-0.99988563]]
/home/neel/Documents/VS-Code_Projects/Machine_Lrn(PY)/tempCodeRunnerFile.py:10: RuntimeWarning: overflow encountered in multiply
  return x * (1-x)
Synaptic weights after trainig:
[[nan]
 [nan]
 [nan]]
Outputs after training: 
[[nan]
 [nan]
 [nan]
 [nan]]
1个回答

3

你的代码中至少有两个问题

第一个问题是在你的sigmoid函数中不必要地使用了2个return语句,正确的写法应该是:

def sigmoid(x):
  return 1/(1 + np.exp(-x))

它可以正确计算 x=0 时的结果(0.5),并且在 x 很大时趋近于1:

sigmoid(0)
# 0.5
sigmoid(20)
# 0.99999999793884631

你(错误的)sigmoid函数:

def your_sigmoid(x):
  return x*(1-x)
  return 1/(1 + np.exp(-x))

很容易导致溢出:

your_sigmoid(20)
# -380

另一个问题是您的导数有误;正确的形式应该是:

def Sigmoid_Derivative(x):
    return sigmoid(x) * (1-sigmoid(x))

请参阅数学问题交流网站 Math.SE 中的Sigmoid函数的导数帖子,以及此处的讨论内容


问题在于我的模型已经过度训练了。将迭代次数缩小到2500就解决了问题。尽管我会尝试开发一段代码来自动确定它的迭代次数。 - neel g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接