神经网络反向传播中的高错误

我正在研究一个项目,该项目使用反向传播神经网络绘制以下函数0.6 * sin(Pi * x)+ 0.3 * cos(3 * Pi * x)。我在没有任何库帮助的情况下使用python,这是该项目的目标。我正在使用一个具有多个神经元,1个输入和1个输出的隐藏层。输入是X,输出是Y,这是每个X的方程式的结果。但是,我得到了很高的误差。我尝试添加更多隐藏层,但仍然是同样的问题。 这是我的代码。

from math import exp
from random import seed
from random import random
import random as rand

def initialize_network(n_inputs, n_hidden, n_outputs):
    network = list()
    hidden_layer = [{'weights':[random() for i in range(n_inputs + 1)]} for i in range(n_hidden)]
    network.append(hidden_layer)

    output_layer = [{'weights':[random() for i in range(n_hidden + 1)]} for i in range(n_outputs)]
    network.append(output_layer)
    return network

def activate(weights, inputs):
    activation = weights[-1]
    for i in range(len(weights)-1):
        activation += weights[i] * inputs[i]
    return activation


def transfer(activation):
    return (1-exp(-activation))/(1+exp(-activation))



def forward_propagate(network, row):
    inputs = row
    for layer in network:
        new_inputs = []
        for neuron in layer:
            activation = activate(neuron['weights'], inputs)
            neuron['output'] = transfer(activation)
            new_inputs.append(neuron['output'])
        inputs = new_inputs
    return inputs



def transfer_derivative(output):
    return 0.5*(1 - output**2)

def backward_propagate_error(network, expected):
    for i in reversed(range(len(network))):
        layer = network[i]
        errors = list()
        if i != len(network)-1:
            for j in range(len(layer)):
                error = 0.0
                for neuron in network[i + 1]:
                    error += (neuron['weights'][j] * neuron['delta'])
                errors.append(error)
        else:
            for j in range(len(layer)):
                neuron = layer[j]
                errors.append(expected[j] - neuron['output'])
        for j in range(len(layer)):
            neuron = layer[j]
            neuron['delta'] = errors[j] * transfer_derivative(neuron['output'])


def update_weights(network, row, l_rate,alpha):
    previous = 0
    for i in range(len(network)):
        inputs = row[:-1]
        if i != 0:
            inputs = [neuron['output'] for neuron in network[i - 1]]
        for neuron in network[i]:
            for j in range(len(inputs)):
                neuron['weights'][j] += l_rate * neuron['delta'] * inputs[j] + alpha*(previous-neuron['weights'][j])
                previous = neuron['weights'][j]
            # Bias weight 1 
            neuron['weights'][-1] += (l_rate * neuron['delta']) 

def train_network(network, train, l_rate, n_outputs,alpha):
    train1 = list()
    output = list()
    stop = False
    for i in range(19):
        train1.append(train[i][0])
    while stop == False:
        sum_error = 0
        output = []
        output1 = []
        rand.shuffle(train)
        for row in train:
            outputs = forward_propagate(network, row)
            expected = [row[-1] for i in range(n_outputs)]
            output.append(outputs)
            sum_error += 0.5*sum([(expected[i]-outputs[i])**2 for i in range(len(expected))])
            backward_propagate_error(network, expected)
            update_weights(network, row, l_rate,alpha)
         for i in range(19):
            output1.append(output[i][0])
        global X
        global Y

        X = train1
        Y = output1
        print('>epoch=%d, lrate=%.3f, error=%.8f' % (n_epoch, l_rate, sum_error))
        if sum_error < 0.001:
            stop = True;

seed(1)
dataset = [

        [0,0.3],
        [5,0.366565],
        [10,0.290527],
        [15,0.205332],
        [20,0.237094],
        [25,0.418632],
        [30,0.664528],
        [35,0.823433],
        [40,0.774376],

        [45,0.505528],
        [50,0.124992],
        [55,-0.20353],
        [60,-0.35945],
        [65,-0.33565],
        [70,-0.23617],
        [75,-0.20304],
        [80,-0.31966],
        [85,-0.55282],
        [90,-0.77087],

     ]


network = initialize_network(1, 20,1)
train_network(network, dataset, 0.3, 1,0)

x = [0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90] 
y = [0.3,0.366565,0.290527,0.205332,0.237094,0.418632,0.664528,0.823433,0.774376,0.505525,0.12,-0.20353,-0.35945,-0.33565,-0.23167,-0.20304,-0.31966,-0.55282,-0.77087] 
plt.plot(x, y) 
plt.plot(X, Y)
plt.show()

Alpha用作动量因子,我认为问题可能出在这里。 我也尝试更改学习率,并向数据集中添加更多数据,但仍然存在很高的错误。

我该怎么办?