根据上一篇https://blog.csdn.net/qq_39432161/article/details/100858656
我们可以看见第一次训练后可变参数w1,w2,w3变成了0.10316052, 0.10316006, 0.10315938,说明训练起作用了,误差loss=61。
第二次训练后可变参数w1,w2,w3变成了0.10554425, 0.10563005, 0.1056722, 28.884804,y变成了28.884804,误差loss=67吗,反而变大了说明优化器继续对可变参数进行了调整,由于我们两次训练输入的数据不同,优化器前一次对可变参数的调整指定的是第一次输入数据所得的结果来进行的,所以第二次训练时,可能反而误差会加大。但是没有关系,神经网络训练具有适应能力,能够在训练过程中调整可变参数,试图去缩小对所有输入数据的计算结果误差。
我们对模型进行多次训练,查看最后稳定时的w1,w2,w3以及loss
我们只要添加一个for训练即可
# Author:北京
# QQ:838262020
# time:2019/9/13
import tensorflow as tf
x1 = tf.placeholder(dtype=tf.float32)
x2 = tf.placeholder(dtype=tf.float32)
x3 = tf.placeholder(dtype=tf.float32)
yTrain = tf.placeholder(dtype=tf.float32)
w1 = tf.Variable(0.01, dtype=tf.float32)
w2 = tf.Variable(0.01, dtype=tf.float32)
w3 = tf.Variable(0.01, dtype=tf.float32)
n1 = x1 * w1
n2 = x2 * w2
n3 = x3 * w3
y = n1 + n2 + n3
loss = abs(y - yTrain)
optimzer = tf.train.RMSPropOptimizer(0.001)
train = optimzer.minimize(loss)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
for i in range(5000):
result1 = sess.run([train, x1, x2, x3, w1, w2, w3, y, yTrain, loss], feed_dict={x1: 92, x2: 98, x3: 94, yTrain: 94})
print(result1)
result2 = sess.run([train, x1, x2, x3, w1, w2, w3, y, yTrain, loss], feed_dict={x1: 92, x2: 99, x3: 96, yTrain: 96})
print(result2)
[None, array(90.0, dtype=float32), array(80.0, dtype=float32), array(70.0, dtype=float32), 0.58388305, 0.28717414, 0.1325421, 85.023247, array(85.0, dtype=float32), 0.023246765]
[None, array(98.0, dtype=float32), array(95.0, dtype=float32), array(87.0, dtype=float32), 0.58284378, 0.2860972, 0.13144642, 96.033249, array(96.0, dtype=float32), 0.033248901]
我们可以看见在经过多轮训练后,可变参数w1,w2,w3稳定在0.58,0.28,0.13,误差在2%,基本和公式中的0.6,0.3,0.1接近。
由于我们数据太少,很难更加逼近真实值,有兴趣的朋友可以根据总分计算规则自行添加更多的数据,来提高可变参数w1,w2,w3的精确度。