首页 > 解决方案 > 神经网络总是输出相同的值

问题描述

import numpy as np

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

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

def cost(x, y):
    return np.sum((y - x) ** 2)

def dcost(x, y):
    return (x - y)

hidden_weights = np.random.normal(scale=0.1, size=(2, 2))
output_weights = np.random.normal(scale=0.1, size=(1, 2))

hidden_biases = np.random.normal(scale=0.1, size=(2, 1))
output_biases = np.random.normal(scale=0.1, size=(1, 1))

def train(rate, hw, ow, hb, ob, i, o):
    input_activations  = sigmoid(i)

    hidden_sums = np.dot(hw, input_activations) + hb
    hidden_activations = sigmoid(hidden_sums)

    output_sums = np.dot(ow, hidden_activations) + ob
    output_activations = sigmoid(output_sums)

    output_deltas = dcost(output_activations, o) * sigmoidPrime(output_activations)
    hidden_deltas = np.dot(ow.T, output_deltas) * sigmoidPrime(hidden_activations)

    ob -= rate * output_deltas
    ow -= rate * np.dot(output_deltas, hidden_activations.T)

    hb -= rate * hidden_deltas
    hw -= rate * np.dot(hidden_deltas, input_activations.T)
    return hw, ow, hb, ob

def predict(hw, ow, hb, ob, i):
    input_activations  = sigmoid(i)

    hidden_sums = np.dot(hw, input_activations) + hb
    hidden_activations = sigmoid(hidden_sums)

    output_sums = np.dot(ow, hidden_activations) + ob
    output_activations = sigmoid(output_sums)
    return output_activations

rate = 0.1

for i in range(0, 10000):
    hidden_weights, output_weights, hidden_biases, output_biases =\
        train(rate, hidden_weights, output_weights, hidden_biases, output_biases, np.array([[0], [0]]), np.array([[0]]))
    hidden_weights, output_weights, hidden_biases, output_biases =\
        train(rate, hidden_weights, output_weights, hidden_biases, output_biases, np.array([[1], [0]]), np.array([[1]]))
    hidden_weights, output_weights, hidden_biases, output_biases =\
        train(rate, hidden_weights, output_weights, hidden_biases, output_biases, np.array([[0], [1]]), np.array([[1]]))
    hidden_weights, output_weights, hidden_biases, output_biases =\
        train(rate, hidden_weights, output_weights, hidden_biases, output_biases, np.array([[1], [1]]), np.array([[0]]))

print(predict(hidden_weights, output_weights, hidden_biases, output_biases, np.array([[0], [0]])))
print(predict(hidden_weights, output_weights, hidden_biases, output_biases, np.array([[1], [0]])))
print(predict(hidden_weights, output_weights, hidden_biases, output_biases, np.array([[0], [1]])))
print(predict(hidden_weights, output_weights, hidden_biases, output_biases, np.array([[1], [1]])))

一切似乎都是正确的,但它总是输出 0.5 左右的浮点数。输出应该接近 0 或 1,因为网络预测 XOR 门的输出。我已经完成了数学并重新检查了几十次,但都没有成功。

然而,我是一名 C++ 程序员,这是我在使用 C++ 之前尝试简单实现神经网络。因此,我对python不太熟悉。

标签: pythonnetworkingbackpropagation

解决方案


推荐阅读