python - 神经网络总是输出相同的值
问题描述
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不太熟悉。
解决方案
推荐阅读
- python - 获取 KeyError:Adj。在 python 中关闭
- javascript - React - 在组件之间传递方法引用
- java - CXF 总线 - 添加具有自定义超时的 HttpConduitFeature
- node.js - 如何在 Windows 中将 npm start 添加为服务
- json - 打字稿中的 JSON 转换
- php - 显示特定尺寸的图像
- c# - 在服务器上运行时获取 AD 组列表失败
- c# - 实例化一个对象但不存储对它的引用
- javascript - 开玩笑测试 onClick() 得到错误“预期的模拟函数已被调用,但没有被调用。”
- java - Swing 应用程序 Exported Jar 扩大维度