一些具体的例子
一个经典的例子就是用神经网络做逻辑运算。我们可以用一个两层神经网络来模拟模拟与运算。下面就是具体的代码:
- # and operation
- X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]).T
- y = np.array([[0],[0],[0],[1]]).T
- net = Net(2,4,1,0.1)
- net.train(X,y)
以下是调用代码给出的结果,可以看出最终的结果效果还不错,经过10000轮的迭代,最终模型给出的结果和我们的期望结果十分相近,实际上如果我们继续进行迭代,这个算法的精度还可以进一步地提高,Loss可以进一步地减少:
- iter = 0, loss =0.105256639066
- === Label vs Prediction ===
- t=[[0 0 0 1]]
- y=[[ 0.40930536 0.4617139 0.36923076 0.4299025 ]]
- iter = 1000, loss =0.0229368486589
- === Label vs Prediction ===
- t=[[0 0 0 1]]
- y=[[ 0.04445123 0.22684496 0.17747671 0.68605373]]
- iter = 2000, loss =0.00657594469044
- === Label vs Prediction ===
- t=[[0 0 0 1]]
- y=[[ 0.01057127 0.11332809 0.11016211 0.83411794]]
- iter = 3000, loss =0.00322081318498
- === Label vs Prediction ===
- t=[[0 0 0 1]]
- y=[[ 0.00517544 0.07831654 0.07871461 0.88419737]]
- iter = 4000, loss =0.00201059297485
- === Label vs Prediction ===
- t=[[0 0 0 1]]
- y=[[ 0.00336374 0.06171018 0.0624756 0.90855558]]
- iter = 5000, loss =0.00142205310651
- === Label vs Prediction ===
- t=[[0 0 0 1]]
- y=[[ 0.00249895 0.05189239 0.05257126 0.92309992]]
- iter = 6000, loss =0.00108341055769
- === Label vs Prediction ===
- t=[[0 0 0 1]]
- y=[[ 0.00200067 0.04532728 0.04585262 0.93287134]]
- iter = 7000, loss =0.000866734887908
- === Label vs Prediction ===
- t=[[0 0 0 1]]
- y=[[ 0.00167856 0.04058314 0.04096262 0.9399489 ]]
- iter = 8000, loss =0.000717647908313
- === Label vs Prediction ===
- t=[[0 0 0 1]]
- y=[[ 0.00145369 0.03696819 0.0372232 0.94534786]]
- iter = 9000, loss =0.000609513241467
- === Label vs Prediction ===
- t=[[0 0 0 1]]
- y=[[ 0.00128784 0.03410575 0.03425751 0.94962473]]
- === Final ===
- X=[[0 0 1 1]
- [0 1 0 1]]
- t=[[0 0 0 1]]
- y=[[ 0.00116042 0.03177232 0.03183889 0.95311123]]
记得初始化
初始化是神经网络一个十分重要的事情,我就不说三遍了,来个实验,如果我们把所有的参数初始化成0,会发生一个可怕的事情:
- X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]).T
- y = np.array([[0],[0],[0],[1]]).T
- net = Net(2,4,1,0.1)
- net.fc1.w.fill(0)
- net.fc2.w.fill(0)
- net.train(X,y)
- print "=== w1 ==="
- print net.fc1.w
- print "=== w2 ==="
- print net.fc2.w
直接看结果:
- === Final ===
- X=[[0 0 1 1]
- [0 1 0 1]]
- t=[[0 0 0 1]]
- y=[[ 3.22480024e-04 2.22335711e-02 2.22335711e-02 9.57711099e-01]]
- === w1 ===
- [[-2.49072772 -2.49072772 -2.49072772 -2.49072772]
- [-2.49072772 -2.49072772 -2.49072772 -2.49072772]]
- === w2 ===
- [[-3.373125]
- [-3.373125]
- [-3.373125]
- [-3.373125]]
不但没有训练出合理的结果,而且每一层的参数还都是一样的。
但是如果把每层参数设为不同的固定值呢?
- X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]).T
- y = np.array([[0],[0],[0],[1]]).T
- net = Net(2,4,1,0.1)
- net.fc1.w.fill(1)
- net.fc2.w.fill(0)
- net.train(X,y)
- print "=== w1 ==="
- print net.fc1.w
- print "=== w2 ==="
- print net.fc2.w