本篇blog目的:展示如何使用tensorflow训练和评估一个简单的前馈神经网络。a simple feed-forward neural network 。面向一些有经验的机器学习人员。
使用的两个文件。
准备数据
1,使用MNIST的数据。
2,我们适应额外的两个占位符tf.placeholder。
images_placeholder = tf.placeholder(tf.float32, shape=(batch_size,
mnist.IMAGE_PIXELS))
labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size))
一,构建图
通过使用mnist.py文件,我们有三段式的过程去创建一张图。inference(), loss(), and training()
1,inference()根据需要构建图,以便向前运行网络。
2,loss() 添加图所需要的损失操作。
3,training() 向损失图中,添加梯度计算的操作。
1,inference()
with tf.name_scope('hidden1'):
在每一层中,添加作用域,作用就是将每一层分开,方便参数命名,例如hidden1/weights,表示层下的参数。
weights = tf.Variable(
tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))),
name='weights')
biases = tf.Variable(tf.zeros([hidden1_units]),
name='biases')
这两个变量的初始化,之前有讲过的。不做累述
hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases)
hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases)
logits = tf.matmul(hidden2, weights) + biases
tf.nn.relu()层的激活函数。有专题讲解激活函数。
tf.matmul()做举证相成操作。
———-inference()结束———–
2,loss()向图中添加损失操作。
labels = tf.to_int64(labels)
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
labels=labels, logits=logits, name='xentropy')
tf.nn.sparse_softmax_cross_entropy_with_logits()有文档介绍。
loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')
tf.reduce_mean()用于计算交叉熵的平均值
注意: 交叉熵是信息论的一个量,用于描述神经网络中预测分布于真实分布的度量。 了解更多(http://colah.github.io/posts/2015-09-Visual-Information/)
————inference()结束————
3,training()向损失图中,添加梯度计算的操作。
#
tf.summary.scalar('loss', loss)
#设置学习率
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
#这是步伐
global_step = tf.Variable(0, name='global_step', trainable=False)
#函数更新系统中的权重以使得loss变小、并作为增加全局步骤的计数器
train_op = optimizer.minimize(loss, global_step=global_step)
———–training()结束————-
二,训练模型
使用fully_connected_feed.py文件,进行模型训练。
1,图
with tf.Graph().as_default():
创建一个默认全局graph实例。
当然也可以使用多个graph。
2,会话
#第一种形式
sess = tf.Session()
#第二种形式
with tf.Session() as sess:
通常情况下,我们需要预先初始化所有variables。
init = tf.global_variables_initializer()
sess.run(init)
The tf.Session.run method 用来运行会话。通常第一步先初始化所有图的参数,第二步就是运行,但是通常是循环运行。
3,循环运行模型
for step in xrange(FLAGS.max_steps):
sess.run(train_op)
通常使用这种python语法。通常会分割一个输入数据集,进行每一步的训练。
4,向图中喂数据
images_feed, labels_feed = data_set.next_batch(FLAGS.batch_size,FLAGS.fake_data)
一般会分割数据集,成多个小片。batch喂图
feed_dict = {
images_placeholder: images_feed,
labels_placeholder: labels_feed,
}
5,检查的状态
一般我们设置每100步,监控看一下运行的状态。
for step in xrange(FLAGS.max_steps):
feed_dict = fill_feed_dict(data_sets.train,
images_placeholder,
labels_placeholder)
_, loss_value = sess.run([train_op, loss],
feed_dict=feed_dict)
if step % 100 == 0:
print('Step %d: loss = %.2f (%.3f sec)' % (step, loss_value, duration))
6,可视化状态TensorBoard
summary = tf.summary.merge_all()
summary_writer = tf.summary.FileWriter(FLAGS.train_dir, sess.graph)
summary_str = sess.run(summary, feed_dict=feed_dict)
summary_writer.add_summary(summary_str, step)
关于TensorBoard更多信息,有专题介绍。
7,保存一个监测点
saver = tf.train.Saver()
saver.save(sess, FLAGS.train_dir, global_step=step)
保存一个监测点,用于以后接着运行。
saver.restore(sess, FLAGS.train_dir)
重新加载监测点。接着运行模型。
三,评估模型
每一千步,我们就进行一次评估,验证,预测。使用do_eval()方法。
print('Training Data Eval:')
do_eval(sess,
eval_correct,
images_placeholder,
labels_placeholder,
data_sets.train)
print('Validation Data Eval:')
do_eval(sess,
eval_correct,
images_placeholder,
labels_placeholder,
data_sets.validation)
print('Test Data Eval:')
do_eval(sess,
eval_correct,
images_placeholder,
labels_placeholder,
data_sets.test)
通常情况下,我们只评估一部分测试数据。但是MNIST数据比较少,所有我们将全部数据进行评估。
1,构建一个评估图
来自mnist.py中的evaluation()方法提供
eval_correct = mnist.evaluation(logits, labels_placeholder)
eval_correct = tf.nn.in_top_k(logits, labels, 1)
2,评估输出
for step in xrange(steps_per_epoch):
feed_dict = fill_feed_dict(data_set,
images_placeholder,
labels_placeholder)
true_count += sess.run(eval_correct, feed_dict=feed_dict)
precision = true_count / num_examples
print(' Num examples: %d Num correct: %d Precision @ 1: %0.04f' %
(num_examples, true_count, precision))
———–本blog结束—–