【问题标题】:Backpropagation Cost Function Error Increases instead of Decreasing反向传播成本函数误差增加而不是减少
【发布时间】:2018-12-10 12:46:33
【问题描述】:

我是 python 和机器学习的新手。有人可以让我知道 ANN 反向传播算法的实现有什么问题。错误值似乎在增加而不是减少。代码如下

从输出中可以看出,误差值在增加。

import math
import random
from random import seed

n_inputs = 3
n_hidden = 3
n_outputs = 1

dataset = [[1, 0, 1], [1]]
wih = [[random.random() for i in range(n_hidden)] for i in range(n_inputs)]
who = [random.random() for i in range(n_hidden)]

def sigmoid(x):
    return 1.0 / (1.0 + math.exp(-x))

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

def activate_ih(data):
    activation = [0, 0, 0]
    for i in range(n_inputs):
        for j in range(n_hidden):
            activation[j] += data[i] * wih[i][j]
    return activation

def activate_ho(data):
    activation = 0
    for i in range(n_hidden):
        activation += data[i] + who[i]
    return activation

def forward_pass():

    input = []
    for x in dataset[0]:
        input.append(sigmoid(x))

    input_h = activate_ih(input)
    output_h = []
    for x in input_h:
        output_h.append(sigmoid(x))

    input_o = activate_ho(output_h)
    output_o = sigmoid(input_o)

    return input_h, output_h, input_o, output_o

def backpropagate_oh(learning_rate, output_h, input_o, output_o):

    error_o = dataset[1][0] - output_o
    output_delta = error_o * derivative_sigmoid(input_o)

    for i in range(n_hidden):
        delta_weight = output_h[i] * output_delta
        who[i] = who[i] + learning_rate*delta_weight

    return output_delta

def backpropagate_hi(learning_rate, input_h, output_delta):

    hidden_delta = []
    for i in range(n_hidden):
        error = who[i] * output_delta
        hidden_delta.append(error * derivative_sigmoid(input_h[i]))

    for i in range(n_input):
        for j in range(n_hidden):
            delta_weight = hidden_delta[j] * dataset[0][j]
            wih[i][j] = wih[i][j] + learning_rate * delta_weight

def trainNetwork(epochs, learning_rate):
    for i in range(epochs):
        sum_error = 0
        inp_h, out_h, inp_o, out_o = forward_pass()
        sum_error = dataset[1][0] - out_o
        print('Epoch {0} \tError'.format(i), sum_error, '\tOuput: ' , out_o, 
        '\tTarget: ', dataset[1][0])
        out_delta = backpropagate_oh(learning_rate, out_h, inp_o, out_o)
        backpropagate_hi(learning_rate, inp_h, out_delta)

trainNetwork(epochs=20, learning_rate=0.5)

【问题讨论】:

    标签: python machine-learning neural-network backpropagation


    【解决方案1】:

    快速浏览一下,您似乎朝着错误的方向迈出了一步。 找到坡度后,您想在 OTHER 方向上迈出一步,因为您想沿着斜坡往下走。 试试who[i] = who[i] - learning_rate*delta_weight

    (这不是一个完整的答案,但我还不能发表评论,所以我需要发布这个。)

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 2016-05-09
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2012-07-22
      • 2019-05-23
      • 2018-01-21
      相关资源
      最近更新 更多