我尝试使用以下神经网络来实现一个简单的与门,但似乎没有工作。以下是我的代码:
import numpy as npdef sigmoid(x,derivative=False): if(derivative==True): return x*(1-x) return 1/(1+np.exp(-x))np.random.seed(1)weights = np.array([0,0,0])training = np.array([[[1,1,1],1], [[1,1,0],0], [[1,0,1],0], [[1,0,0],0]])for iter in xrange(training.shape[0]):#forwardPropagation: a_layer1 = training[iter][0] z_layer2 = np.dot(weights,a_layer1) a_layer2 = sigmoid(z_layer2) hypothesis_theta = a_layer2#backPropagation: delta_neuron1_layer2 = a_layer2 - training[iter][1] Delta_neuron1_layer2 = np.dot(a_layer2,delta_neuron1_layer2) update = Delta_neuron1_layer2/training.shape[0] weights = weights-updatex = np.array([1,0,1])print weightsprint sigmoid(np.dot(weights,x))
上面的程序一直返回奇怪的值,输入X返回的值高于数组[1,1,1]。每个训练/测试’输入’的第一个元素代表偏置单元。代码是基于Andrew Ng在Coursera的机器学习课程视频改编的: https://www.coursera.org/learn/machine-learning
提前感谢您的帮助。
回答:
几点建议:
- 神经网络需要大量数据。你不能只传递几个样本就期望它学到很多东西。
- 你使用的是列表和一维数组而不是二维数组。这在使用numpy时是危险的,因为它会在没有指定形状的情况下盲目地进行广播,这在某些情况下可能是危险的。
- 你在反向传播中没有使用sigmoid的导数,这是不正确的。
我已经重新调整了你的数组,并且增加了你的输入量。
输出:
[[ 0.34224604]][[ 0.19976054]][[ 0.52710321]]
这还不完美,还有改进的空间。但至少,你现在有了一些成果。预期输出理论值为0的输入,其结果比预期输出理论值为1的输入更接近0。