【问题标题】:Numpy dot product returns array of [inf]Numpy 点积返回 [inf] 数组
【发布时间】:2019-01-25 12:39:02
【问题描述】:

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

输入为:

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)

现在,当我尝试在没有for loop 的情况下打印weights_out=activation_1.T.dot(error_on_output)*learning_rate 时,它会为我提供weights_out 的正确更新值。但是,由于我在for loop 中使用相同的代码进行迭代等于epoch,所以它返回为:

[[nan]
 [nan]
 [nan]]

我已经单独尝试了每一行并获得了正确的值,并将 dtype 更改为“float64”,但代码似乎在 for 循环中不起作用。是不是循环有问题?

【问题讨论】:

  • 注释掉np.seterr(divide='ignore', invalid='ignore') 。这可能会为您提供有关 NaN 来自何处的更多信息。
  • @unutbu 如您所说检查但仍然无法正常工作。我检查了 epoch 值是否为 5 并获得了 [[30.52973921] [31.90311617] [31.3969178 ]] [[nan] [nan] [nan]] [[nan] [nan] [nan]] [[nan] [nan] [nan]] [[nan] [nan] [nan]] 循环仅适用于一次迭代
  • 现在我想了想,我认为导函数应该是1*(1-x) 而不是1/(1-x) 这应该避免零除并导致正确的输出。
  • 如果您是 Python 新手,请随意将代码中的字符留出一点空间,以便文本呼吸并更具可读性。它不是 .ini 文件 :-) 例如
  • activation_2_input=(np.dot(activation_1,weights_out))+bias_out 可以写成activation_2_input = np.dot(activation_1, weights_out) + bias_out

标签: python-3.x numpy for-loop numpy-ndarray


【解决方案1】:

hidden_layer_output 的输出变得非常大 (> 20)。然后,您将应用 sigmoid 函数,activation_1 中的值越来越接近。事实上,距离太近,计算机无法区分值和 1。

当您在反向传播期间计算 rate_change_hidden_output 时,您正在计算这些值的 derivative_sigmoid。所以你正在计算 1/(1-1) 的 nan 结果。

这些 nan 值然后传播到所有值,导致所有值都是 nan。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多