这个其实就是我的《1、深度学习-带你理解深度学习的基础原理。没有复杂的公式,只有大白话。同时也是深入学习的心法》举例的红绿灯的升级版,我在《1、深度学习-带你理解深度学习的基础原理。没有复杂的公式,只有大白话。同时也是深入学习的心法。
》只有红灯和绿灯两个灯,但是在这个程序里面有三个灯。但是基础原理都是一样的。
import numpy as np
weights = np.array([0.5,0.48,0.7]) #随机设置权重值,对应的红灯,绿灯,黄灯的初始权重。
'''
streetlights = np.array([[1,0,1],
[0,1,1],
[0,0,1],
[1,1,1],
[0,1,1],
[1,0,1]])
'''
streetlights = np.array([
[1,0,1], #红灯亮,绿灯灭,黄灯亮。 对应的真实值是0,此时是禁止行走的状态。
[0,1,1], #红灯灭,绿灯亮,黄灯亮。 对应的真实值是1,此时是可以行走的状态。
[0,0,1]]) #红灯灭,绿灯灭,黄灯亮。 对应的真实值是0,此时是禁止行走的状态。
#灯的状态,输入值。具体的数据,你们也可以按照自己的想法再设置,这个就和规则一样,你给它一个规#则,它按照你给的规则训练就对了。如果你给的规则是红灯亮了,可以同行,绿灯亮了禁止通行,它也会#按照你的规则来做。因为它就是根据你给的规则,学习这个规则。
#walk_vs_stop = np.array([0,1,0,1,1,0])
walk_vs_stop = np.array([0,1,0]) #是否通行的真实数据值。
input = streetlights[0] #把灯的状态赋值给输入值input
goal_prediction = walk_vs_stop[0] #把真实结果赋值给目标预测值。
alpha = 0.1 #设置学习率为0.1
for iteration in range(60): #循环60次计算更新权重。
error_fo_all_light = 0 #误差值设置为0
#print("itertion"+str(iteration))
for row_index in range(len(walk_vs_stop)): #根据真实数据的个数,来更新权重
input = streetlights[row_index] #将要计算的数据,赋值给input,方便理解和计算。
goal_prediction = walk_vs_stop[row_index] #赋值目标预测值也就是真实值
prediction = input.dot(weights)#计算预测值
#print("input"+str(input))
#print("weight:"+str(weights))
error = (goal_prediction - prediction)**2 #计算误差值最小二乘法
#print("error:"+str(error))
delta = prediction - goal_prediction #计算梯度
error_fo_all_light +=error #误差值累计
weights = weights - (alpha*input*delta) #更新权重
#print("prediction:"+str(prediction))
print("error"+str(error_fo_all_light)+"\n")
#代入权重进行测试使用
streetlights = np.array(
[0,1,0]) #测试使用,此时的红绿灯的亮灭状态为:红灯灭,绿灯亮。黄灯灭。
input = streetlights #把输入的灯的状态值给input。
layer_1 = input.dot(weights)#使用已经训练好的权重,对输入的值就行预测。
print("text_layer_1"+str(layer_1))输出预测的值。
运行结果为:
error1.7730759999999999
error1.004538871316
error0.6220576534720047
error0.41905749371168344
error0.30236992404325447
error0.22931386622553274
error0.17984884824760355
error0.1442044337990159
error0.11735362575191485
error0.09652232049172713
error0.08005176441098516
error0.06686809827192935
error0.05622712152920667
error0.047585794545122045
error0.04053349836271996
error0.034752467517068945
error0.029993175689467418
error0.026057884297282802
error0.022788986212112367
error0.02006038575270362
error0.01777093526238826
error0.015839341682790758
error0.014200165797068533
error0.012800655660299993
error0.011598228141400182
error0.010558459713943837
error0.009653480275693231
error0.008860687404521833
error0.00816171614170987
error0.0075416129372071926
error0.006988172926749178
error0.00649140799042864
error0.006043119593418622
error0.005636555615908947
error0.005266134529060572
error0.0049272235876924135
error0.004615960360209798
error0.004329109036834427
error0.004063944655162531
error0.0038181597421838398
error0.0035897889616491076
error0.003377148228975013
error0.0031787854558122594
error0.002993440647453897
error0.0028200135260298296
error0.002657537213028177
error0.002505156793815253
error0.002362111818681561
error0.0022277219808925774
error0.00210137536137831
error0.0019825187493571423
error0.001870649644205947
error0.0017653096209487794
error0.001666078803597914
error0.0015725712402538802
error0.001484431013769988
error0.0014013289538445408
error0.0013229598421723053
error0.00124904002300777
error0.0011793053481634168
text_layer_10.9598417799112918
从运行结果可以看出来:经过60次的训练,损失值,也就是预测值和真实值之间的偏差越来越小了。
Error从最初的1.7730759999999999经过60次训练后减小到0.0011793053481634168。
说明我们的模型训练时有用的。
同时把我们的输入数据代入后,得到的预测值为:0.9598417799112918非常接近于1,说明我们现在时该行走的状态。