Tensorflow学习笔记(4)

模型票评估:使用验证集来判断。在这个程序的开始设置了初始学习率、学习率衰减率、隐藏层节点数量、迭代轮数等7种不同的参数。在大部分情况下,配置神经网络的这些参数都是需要通过实验来调整的。虽然一个神经网络模型的效果最终是通过测试数据来评判的,但是我们不能直接通过模型在测试数据上的效果来选择参数。使用测试数据来选取参数可能会导致神经网络模型过度拟合测试数据,从而失去对未知数据的预判能力。

因为神经网络的输入是一个特征向量,所以在此把一张二维图像的像素矩阵放到一个一维数组中可以方便TensorFlow将图片的像素矩阵提供给神经网络的输入层。像素矩阵中元素的取值范围为[0,1],它代表了颜色的深浅。其中0表示白色背景(background),1表示黑色前景(foreground)。

持久化代码实现:

saver=tf.train.Saver()
with tf.Session() as sess:
saver.save(sess,"path/to/model.ckpt)

持久化会生成三个文件:

  1. 第一个文件为model.ckpt.meta,它保存了tensorflow计算图的结构。
  2. 第二个文件为model.ckpt,这个文件中保存了TensorFlow程序中每一个变量的取值。
  3. 第三个文件为checkpoint文件,这个文件中保存了一个目录下所有的模型文件列表。

调用模型saver.restore(sess,"path/to/model/model.ckpt")(调用存储变量值)

saver=tf.train.import_meta_graph("path/to/model/model.ckpt.meta")

使用tf.train.Saver()会保存运行TensorFlow程序所需要的全部信息,然而有时并不需要某些信息。比如在测试或者离线预测时,只需要知道如何从神经网络的输入层经过前向传播计算得到输出层即可,而不需要类似于变量初始化、模型保存等辅助节点的信息。

TensorFlow提供了convert_variables_to_constants函数,通过这个函数可以将计算图中的变量及其取值通过常量的方式保存,这样整个TensorFlow计算图可以统一存放在一个文件中。

持久化原理:tensorflow持久化通过保存的四个文件来进行的。
TensorFlow通过元图(MetaGraph)来记录计算图中节点的信息以及运行计算图中节点所需要的元数据。

1.tf.add_to_collection(name,value)
功能:将变量添加到名为name的集合中去。
参数:(1)name:集合名(2)value:被添加的变量
2.tf.get_collection(key,scope=None)
功能:获取集合中的变量。
参数:(1)key:集合名
3.tf.add_n(inputs,name=None)
功能:以元素方式添加所有输入张量。
参数:(1)inputs:张量对象列表,每个对象具有相同的形状和类型。
(2) name:操作的名称(可选)

tf.nn.softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits

函数说明:
在计算交叉熵之前,通常要用到softmax层来计算结果的概率分布。因为softmax层并不会改变最终的分类结果(排序)。所以,tensorflow将softmax层与交叉熵函数进行封装,形成一个函数方便计算:tf.nn.softmax_cross_entropy_with_logits(logits= , labels=)。为了加速计算过程,针对只有一个正确答案(例如MNIST识别)的分类问题,tensorflow提供了tf.nn.sparse_softmax_cross_entropy_with_logits(logits= , labels=)
函数的区别:
两个函数虽然功能类似,但是其参数labels有明显区别。tf.nn.softmax_cross_entropy_with_logits()中的logits和labels的shape都是[batch_size,num_classes],而tf.nn.sparse_softmax_cross_entropy_with_logits[]中的labels是稀疏表示的,是(0,num_classes)中的一个数值,代表正确分类结果。即sparse_softmax_cross_entropy_with_logits 直接用标签计算交叉熵,而 softmax_cross_entropy_with_logits 是标签的onehot向量参与计算。softmax_cross_entropy_with_logits 的 labels 是 sparse_softmax_cross_entropy_with_logits 的 labels 的一个独热版本one_hot。

tf.argmax()函数:

import tensorflow as tf
y=tf.constant([0.4,0.6,0.8,1.0,0.3])
arg=tf.argmax(y,-1)
with tf.Session() as sess:
    tf.global_variables_initializer().run()
     print(sess.run(arg))
     print:3
     #求y最大值的索引号。

tf.control_dependencies():
设计是用来控制计算流图的,给图中的某些计算指定顺序。比如:我们想要获取参数更新后的值,那么我们可以这么组织我们的代码。自己的理解:如果不是tf的tensor,并且没有加入到整个图中,则不会执行;
eg:

x = tf.Variable(0.0)
x_plus_1 = tf.assign_add(x, 1)
with tf.control_dependencies([x_plus_1]):
    y = tf.identity(x)#修改部分  
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    for i in range(5):
        print(sess.run(y))
        #This works: it prints 1, 2, 3, 4, 5.
#############################################
   with tf.control_dependencies([a, b, c]):
   # `d` and `e` will only run after `a`, `b`, and `c` have executed.
   d = ...
   e = ...

tf.Graph().as_default() :
表示将这个类实例,也就是新生成的图作为整个 tensorflow 运行环境的默认图,如果只有一个主线程不写也没有关系,tensorflow 里面已经存好了一张默认图,可以使用tf.get_default_graph() 来调用(显示这张默认纸),当你有多个线程就可以创造多个tf.Graph(),就是你可以有一个画图本,有很多张图纸,这时候就会有一个默认图的概念了。

tf.train.get_checkpoint_state函数会通过checkpoint文件自动找到目录中最新的模型文件名
准确率计算:

correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

猜你喜欢

转载自blog.csdn.net/WSNjiang/article/details/83145620