【问题标题】:Unwanted [Nan] output in Python neural networkPython 神经网络中不需要的 [Nan] 输出
【发布时间】:2020-01-17 14:21:39
【问题描述】:

这里是新手。刚刚从 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]]

【问题讨论】:

    标签: python numpy machine-learning neural-network sigmoid


    【解决方案1】:

    您的代码至少有 两个 问题。

    首先是在你的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 上的 Derivative of sigmoid function 线程,以及讨论 here

    【讨论】:

    • 问题是我的模型明显过度训练。将迭代缩小到 2500 次就可以了。虽然我会尝试开发一个代码来自动找出它的迭代
    猜你喜欢
    • 2015-01-24
    • 2015-02-23
    • 2020-03-15
    • 2020-10-24
    • 1970-01-01
    • 2017-11-21
    • 2012-01-16
    相关资源
    最近更新 更多