Python 3.x Numpy点积返回[inf]的数组

Python 3.x Numpy点积返回[inf]的数组,python-3.x,numpy,for-loop,numpy-ndarray,Python 3.x,Numpy,For Loop,Numpy Ndarray,我是python新手,正在深入学习,所以我用python创建了一个基本的神经网络代码。有一个神经元的输入值为(1到49),单输出值为sin(输入)。我所做的就是: 输入为: array([[ 1.], [ 2.], [ 3.], [ 4.], [ 5.],.....[49]] 输出为: array([[ 0.84147098], [ 0.90929743], [ 0.14112001], [-0.

我是python新手,正在深入学习,所以我用python创建了一个基本的神经网络代码。有一个神经元的输入值为(1到49),单输出值为
sin(输入)
。我所做的就是:

输入为:

array([[ 1.],
       [ 2.],
       [ 3.],
       [ 4.],
       [ 5.],.....[49]]
输出为:

array([[ 0.84147098],
       [ 0.90929743],
       [ 0.14112001],
       [-0.7568025 ],.....]
完整代码:

import numpy as np
import pandas as pd
data=pd.read_excel("C:/Users/neural_network.xlsx")
total_rows=data.shape[0]
np.seterr(divide='ignore', invalid='ignore') 

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

def derivative_sigmoid(x):
    derivative=x/(1-x)
    return derivative


epoch=5000
hidden_layer=3
input_neurons=1
output_neurons=1
learning_rate=0.1
input_array=data['input'].values.reshape(total_rows,1)
input_array=input_array.astype(np.float64)
output_array=data['output'].values.reshape(total_rows,1)
output_array=output_array.astype(np.float64)

weights_in=np.random.uniform(size=(input_neurons,hidden_layer)) 
weights_in=weights_in.astype(np.float64)
bias_in=np.random.uniform(size=(1,hidden_layer))
bias_in=bias_in.astype(np.float64)
weights_out=np.random.uniform(size=(hidden_layer,output_neurons))
weights_out=weights_out.astype(np.float64)
bias_out=np.random.uniform(size=(1,output_neurons))
bias=weights_in.astype(np.float64)

for i in range(epoch):

    #forward propogation
    hidden_layer_output=(np.dot(input_array,weights_in))+bias_in
    activation_1=sigmoid(hidden_layer_output)
    activation_2_input=(np.dot(activation_1,weights_out))+bias_out
    predicted_output=sigmoid(activation_2_input)


    # #backward propogation

    Error=(predicted_output-output_array)

    rate_change_output=derivative_sigmoid(predicted_output)
    rate_change_hidden_output=derivative_sigmoid(activation_1)
    error_on_output=Error*rate_change_output
    error_hidden_layer=error_on_output.dot(weights_out.T)
    delta_hidden_layer=error_hidden_layer*rate_change_hidden_output
    weights_out+=activation_1.T.dot(error_on_output)*learning_rate
    weights_in+=input_array.T.dot(delta_hidden_layer)*learning_rate
    bias_out+=np.sum(error_on_output,axis=0,keepdims=True)*learning_rate
    bias_in+=np.sum(error_hidden_layer,axis=0,keepdims=True)*learning_rate  

print (weights_out)
现在,当我试图打印
weights\u out=activation\u 1.T.dot(输出错误)*学习速率
而不打印
for loop
时,它会为
weights\u out
提供正确的更新值。但是,当我在
for循环
中使用相同的代码段时,迭代等于
历元
,它返回为:

[[nan]
 [nan]
 [nan]]

我已经分别尝试了每一行,并获得了正确的值,还将数据类型更改为“float64”,但代码在
for
循环中似乎不起作用。循环中有什么问题吗?

隐藏层输出的输出越来越大(>20)。然后应用sigmoid函数,
activation_1
中的值越来越接近。事实上,距离太近,计算机无法区分值和1

在反向传播过程中,当您计算
速率\u变化\u隐藏\u输出时,您正在计算这些值的
导数\u sigmoid
。因此,您正在计算nan中的1/(1-1)whitch结果


这些nan值随后通过所有值传播,导致所有值均为nan。

注释掉
np.seterr(divide='ignore',invalid='ignore')
。这可能会为您提供有关NAN来自何处的更多信息。@unutbu已按您所说进行检查,但仍不起作用。我已经检查了历元值为5,得到的值为
[[30.52973921][31.90311617][31.3969178][[nan][nan][nan][nan][nan][nan][nan][nan][nan][nan nan][nan nan][nan nan nan nan nan][nan nan nan nan nan nan循环只工作了一次。现在我想起来,我认为导数函数应该是
1*(1-x)
这应该避免零除法,并产生正确的输出。如果您是Python新手,请随意在代码中留出一点字符,以便文本能够呼吸并更具可读性。它不是一个.ini文件:-)例如
activation\u 2\u input=(np.dot(activation\u 1,weights\u out))+bias\u out
可以写入
activation\u 2\u input=np.dot(activation\u 1,weights\u out)+bias\u out