利用TensorFlow来训练所有的神经网络的训练过程可以分为如下3个步骤:
①定义神经网络的结构和前向传播的输出结果。
②定义损失函数以及选择反向传播优化算法。
③生成会话(tf.Session)并且在训练数据上反复运行反向传播优化算法。
下面给出一个简单的二分类问题的神经网络算法(完整的流程)
神经网络具体结构如下图:
训练流程图:
几个解释:
①Numpy 是一个科学计算的工具箱的,这里通过Numpy生成模拟数据集。
②batch是每一次的训练数据的大小。
③损失函数是交叉熵(cross_entropy)
具体解释请看:http://www.omegaxyz.com/2018/05/07/information_entropy/
④反向传播算法可以使用梯度下降法:tf.train.GradientDescentOptimizer(0.05).minimize(cross_entropy)或者tf.train.AdamOptimizer(0.002).minimize(cross_entropy)
文章中使用的是AdamOptimizer,学习率是0.002。
⑤这里所有x1+x2<1的样例都被认为是正样本。
⑥每隔一段时间计算在所有数据上的交叉熵并输出,交叉熵越小说明预测的结果和真实的结果差距越小,这里用matplotlib画图。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import tensorflow as tf import matplotlib.pyplot as plt from numpy.random import RandomState # Numpy 是一个科学计算的工具箱的,这里通过Numpy生成模拟数据集 # 定义训练数据batch的大小 batch_size = 8 w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1)) w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1)) x = tf.placeholder(tf.float32, shape=(None, 2), name='x-input') y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input') # 定义神经网络前向传播过程 a = tf.matmul(x, w1) y = tf.matmul(a, w2) # 定义损失函数和反向传播算法 cross_entropy = -tf.reduce_mean( y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) train_step = tf.train.AdamOptimizer(0.002).minimize(cross_entropy) # 采用梯度下降优化器进行优化 # train_step = tf.train.GradientDescentOptimizer(0.05).minimize(cross_entropy) # 通过随机数生成一个模拟数据集 rdm = RandomState(1) dataset_size = 128 X = rdm.rand(dataset_size, 2) # 产生样本标签,这里所有x1+x2<1的样例都被认为是正样本 Y = [[int(x1 + x2 < 1)] for (x1, x2) in X] # 创建一个会话来运行tensorflow程序 with tf.Session() as sess: init_op = tf.initialize_all_variables() sess.run(init_op) print(sess.run(w1)) print(sess.run(w2)) STEPS = 5000 plt.axis([0, 5000, 0, 0.08]) plt.ion() x11 = [0, 0] y11 = [1, 1] for i in range(STEPS): start = (i * batch_size) % dataset_size end = min(start + batch_size, dataset_size) # 通过选取的样本训练神经网络并更新参数 sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]}) if i % 100 == 0: # 每隔一段时间计算在所有数据上的交叉熵并输出,交叉熵越小说明预测的结果和真实的结果差距越小 total_cross_entropy = sess.run(cross_entropy, feed_dict={x: X, y_: Y}) print("After %d training step,cross entropy on all data is %g" % (i, total_cross_entropy)) x11[0] = x11[1] y11[0] = y11[1] x11[1] = i y11[1] = total_cross_entropy plt.plot(x11, y11) plt.xlabel("Step") plt.ylabel("Cross Entropy") plt.pause(0.05) # print(sess.run(w1)) # print(sess.run(w2)) plt.pause(10) |
结果:
交叉熵越低,结果越好