Продукт Numpy dot возвращает массив [inf] - PullRequest
0 голосов
/ 25 января 2019

Я новичок в 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)

Сейчаскогда я пытаюсь напечатать weights_out=activation_1.T.dot(error_on_output)*learning_rate без for loop, тогда мне выдаются правильные обновленные значения для weights_out.Но, поскольку я использую тот же кусок кода в for loop для итерации, равной epoch, то он возвращается как:

[[nan]
 [nan]
 [nan]]

Я пробовал каждую строку отдельно и получаю правильные значения итакже измените dtype на «float64», но кажется, что код не работает внутри цикла for.Что-то не так в цикле?

1 Ответ

0 голосов
/ 25 января 2019

Выходы hidden_layer_output становятся очень большими (> 20). Затем вы применяете сигмовидную функцию, и значения в activation_1 приближаются. На самом деле слишком близко, чтобы компьютер мог различить значение до 1.

Когда вы вычисляете rate_change_hidden_output во время обратного распространения, вы вычисляете derivative_sigmoid из этих значений. Таким образом, вы рассчитываете 1 / (1-1), что приводит к нан.

Эти наноструктуры затем распространяются через все значения, в результате чего все значения являются нан.

...