[吃药深度学习随笔] 反向传播:训练模型参数 令参数梯度下降 使神经网络的损失函数最小

其中 最为常用的优化器是 GradientDescentOptimizer  梯度下降优化器

例子:

import tensorflow as tf
import numpy as np
#一次给神经网络多少组数值
BATCH_SIZE = 8
seed = 23456

#给予seed产生随机数
rng = np.random.RandomState(seed)
#随机数返回32行2列的矩阵 表示32组体积和重量
X = rng.rand(32, 2)
#从X中取出一行 如果和小于1 则Y=1 如果和不小于1 Y=0
#作为数据集的正确答案
Y = [[int(x0 + x1 < 1)] for (x0, x1) in X]
print ("X:\n", X)
print ("Y:\n", Y)

#定义神经网络的输入、参数和输出,定义前向传播过程
x = tf.placeholder(tf.float32, shape=(None, 2))
y = tf.placeholder(tf.float32, shape=(None, 1))

w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=seed))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=seed))

a = tf.matmul(x, w1)
result = tf.matmul(a, w2)

#定义损失函数和反向传播方法
loss = tf.reduce_mean(tf.square(y - result))
#学习速率为0.01
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
#或以下其他优化器
#train_step = tf.train.MomentumOptimizer(0.001, 0.9).minimize(loss)
#train_step = tf.train.AdadeltaOptimizer(0.001).minimize(loss)

#生成会话 训练Steps轮
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    #输出未经训练的参数取值
    print ("w1:\n", sess.run(w1))
    print ("w2:\n", sess.run(w2))
    print ("\n")

    #训练模型
    Steps = 10000
    for i in range(Steps):
        start = (i*BATCH_SIZE) % 32
        end = start + BATCH_SIZE
        sess.run(train_step, feed_dict={x: X[start:end], y: Y[start:end]})
        if i % 500 == 0:
            total_loss = sess.run(loss, feed_dict={x: X, y: Y})
            print ("经过 %d 训练步数后 ,损失值为 %g" %(i, total_loss))

    #输出训练后参数取值
    print ("\nw1:\n", sess.run(w1))
    print ("w2:\n", sess.run(w2))

得出结果:

X:
 [[0.32180029 0.32730047]
 [0.92742231 0.31169778]
 [0.16195411 0.36407808]
 [0.52921787 0.78906542]
 [0.87538918 0.63668173]
 [0.98971063 0.81588568]
 [0.04131214 0.20293306]
 [0.15239859 0.75305119]
 [0.45518823 0.95462394]
 [0.93736249 0.13540527]
 [0.23590741 0.31481851]
 [0.67268806 0.6205815 ]
 [0.62213225 0.83785561]
 [0.63080942 0.56094684]
 [0.98685542 0.68312701]
 [0.10132647 0.9400749 ]
 [0.65133392 0.22740402]
 [0.43175051 0.39008659]
 [0.75575789 0.14263881]
 [0.00986137 0.83789633]
 [0.1088419  0.24922406]
 [0.47589593 0.88392026]
 [0.17748576 0.78598088]
 [0.03505506 0.6086414 ]
 [0.30842493 0.76987382]
 [0.59659897 0.09442643]
 [0.44347345 0.80464729]
 [0.66084164 0.21687942]
 [0.9131448  0.58996414]
 [0.83554249 0.59131388]
 [0.2829476  0.05663651]
 [0.2916721  0.33175172]]
Y:
 [[1], [0], [1], [0], [0], [0], [1], [1], [0], [0], [1], [0], [0], [0], [0], [0], [1], [1], [1], [1], [1], [0], [1], [1], [0], [1], [0], [1], [0], [0], [1], [1]]
w1:
 [[-1.6896118  -0.8381871   0.06722452]
 [ 1.4604684   0.80024296 -0.5019904 ]]
w2:
 [[-1.6896118 ]
 [-0.8381871 ]
 [ 0.06722452]]


经过 0 训练步数后 ,损失值为 2.65995
经过 500 训练步数后 ,损失值为 0.404596
经过 1000 训练步数后 ,损失值为 0.400291
经过 1500 训练步数后 ,损失值为 0.400269
经过 2000 训练步数后 ,损失值为 0.400269
经过 2500 训练步数后 ,损失值为 0.400269
经过 3000 训练步数后 ,损失值为 0.400269
经过 3500 训练步数后 ,损失值为 0.400269
经过 4000 训练步数后 ,损失值为 0.400269
经过 4500 训练步数后 ,损失值为 0.400269
经过 5000 训练步数后 ,损失值为 0.400269
经过 5500 训练步数后 ,损失值为 0.400269
经过 6000 训练步数后 ,损失值为 0.400269
经过 6500 训练步数后 ,损失值为 0.400269
经过 7000 训练步数后 ,损失值为 0.400269
经过 7500 训练步数后 ,损失值为 0.400269
经过 8000 训练步数后 ,损失值为 0.400269
经过 8500 训练步数后 ,损失值为 0.400269
经过 9000 训练步数后 ,损失值为 0.400269
经过 9500 训练步数后 ,损失值为 0.400269

w1:
 [[-1.3020214  -0.64970225  0.07440575]
 [ 0.5934312   0.42608732 -0.795439  ]]
w2:
 [[-0.16184632]
 [ 0.0288484 ]
 [-0.63328326]]

总结:

  搭建神经网络的的步骤:准备、前传、反传、迭代

准备:

  import

  定义常量

  生成/导入数据集

前向传播:

  定义输入、参数、输出

  如上例子的

  x,y

  w1,w2

  a,result

后向传播:

  定义损失函数、反向传播方法

  loss 

  train_step

生成会话,进行N轮训练

    Steps = 10000
    for i in range(Steps):
        start = (i*BATCH_SIZE) % 32
        end = start + BATCH_SIZE
        sess.run(train_step, feed_dict={x: X[start:end], y: Y[start:end]})
        if i % 500 == 0:
            total_loss = sess.run(loss, feed_dict={x: X, y: Y})
            print ("经过 %d 训练步数后 ,损失值为 %g" %(i, total_loss))

这样一个神经网络就搭建好了

猜你喜欢

转载自www.cnblogs.com/EatMedicine/p/9029711.html