其中 最为常用的优化器是 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))
这样一个神经网络就搭建好了