第一阶段-入门详细图文讲解tensorflow1.4 -(六)tensorflow运行机制MNIST

来源:互联网 发布:dynamic duo知乎 编辑:程序博客网 时间:2024/05/02 10:34

本篇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_examplesprint('  Num examples: %d  Num correct: %d  Precision @ 1: %0.04f' %      (num_examples, true_count, precision))

———–本blog结束—–

阅读全文
0 0