Вычисление функции sin с помощью нейронной сети с использованием Python - PullRequest
0 голосов
/ 28 января 2019

Я новичок в глубоком изучении и пытаюсь создать базовую нейронную сеть для функции греха.Я сгенерировал массив с произвольными значениями формы (50,1), который выдает sin(input).

Нейронная сеть включает в себя один скрытый слой (3 нейрона) с функцией активации как sigmoid, а конечный выходной нейрон также состоит из sigmoid функции активации.После обучения сети с эпохой 20000 и скоростью обучения 0.1 окончательная ошибка, по-видимому, не приближается к нулю .

Полный код:

import numpy as np
import pandas as pd
import random
np.random.seed(1000)
input_array=np.random.uniform(size=(50,1))
output_array=np.sin(input_array)
total_rows=input_array.shape[0]

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


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


epoch=20000
hidden_layer=3
input_neurons=1
output_neurons=1
learning_rate=0.1
input_array=data['input'].values.reshape(total_rows,1)
output_array=data['output'].values.reshape(total_rows,1)    
weights_in=np.random.uniform(size=(input_neurons,hidden_layer)) 
bias_in=np.random.uniform(size=(1,hidden_layer))
weights_out=np.random.uniform(size=(hidden_layer,output_neurons))
bias_out=np.random.uniform(size=(1,output_neurons))

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 (Error)

Причина, по которой я использовал сигмовидные функции в качестве конечного результата, находится в диапазоне 0-1 (пожалуйста, исправьте меня, если я ошибаюсь).Вот ошибка .

Может кто-нибудь подсказать, что, возможно, я делаю не так?

1 Ответ

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

Значения синуса движутся в интервале [-1,1].Если вы используете сигмоид в качестве выходной активации, ваша модель может выводить значения только в [0,1] и, таким образом, не имеет шансов правильно предсказать значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...