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

本文详细介绍了使用TensorFlow 1.4训练和评估简单前馈神经网络的过程,涵盖数据准备、图构建、训练模型及模型评估。通过MNIST数据集,解释了inference、loss和training三个关键部分,并提到了TensorBoard的使用以及模型监测点的保存与加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇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结束—–

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值