tensorflow的一些笔记

模型的保存加载

checkpoint 文件保存了一个目录下所有模型文件的文件列表
model.ckpt.meta 保存计算图模型
model.ckpt 保存了程序中每一个变量的取值,是(key,value)列表
Saver类可以处理图中数据和变量数据的保存和恢复,默认情况下,Saver类能处理默认图中包含的所有变量

main():
    ...//加载设计好的操作,即默认图
    saver = tf.train.Saver() //默认处理所有有关的变量
    with tf.Session() as sess: //启动默认图
        sess.run(initialiezr)
        sess.run(操作,feed_dict)
        saver.save(sess,path,global_step=i) //保存sess图及所有变量
//使用一个sess来启动图,并用一个sess.run来执行操作

test():
    ...//加载图
    saver = tf.train.Saver()
    with tf.Session() as sess:
        module_file = tf.train.latest_checkpoint('../ckpt/')
        saver.resotre(sess.module_file)  //恢复变量
        out = sess.run(操作)

变量的维护
tensorflow可以通过collection(集合)来管理不同类别的资源
tf.get_collection(name,value) 获得集合中的value变量,返回一个列表
name是collection的名字,包括如下:
这里写图片描述
return:
The list of values in the collection with the given name, or an empty list

在ly.optimize_loss中可以指定更新的variables
这里写图片描述

这里写图片描述

collection:所有的变量都会被自动的加入GraphKeys.VARIABLES这个集合。通过tf.all_variables函数可以拿到当前计算图上所有的变量。拿到计算图上所有的变量有助于持久化整个计算图的运行状态。
  可以通过变量声明函数中的trainable参数来区分需要优化的参数和其他不需要优化的参数。如果声明变量时参数trainable为True,那么这个变量就会被加入GraphKeys.TRAINABLE_VARIABLES集合。在TensorFlow中可以通过tf.trainable_variables函数得到所有需要优化的参数。设置神经网络参数的过程就是神经网络的训练过程。
这里写图片描述
例如上面的conv2d的trainable参数为True,所以这个函数定义的变量都保存到tf.TRAINABLE_VARIABLES集合中。

padding 计算
Valid = without padding
Same = with zero padding
Valid: new_height = (W-F+1)/S ( 结果向上取整 )
Same: new_height = W/S (结果向上取整)

Gpu,Cpu资源分配
一般不需要显式指定使用 CPU还是 GPU,Tensorflow可以自动检测,如果检测到GPU,Tensorflow会尽可能的用到第一个 GPU 来执行操作
如果有超过一个 GPU,除了第一个 GPU,其他的默认是不参与运算的,为了使用其他的GPU,必须将op明确指派给它们执行,with … Device 语句用来指派特定的 GPU 或者 CPU 执行操作

with tf.Session() as sess:
    with tf.device("/gpu:1"):
        matrix1 = tf.constant([[3., 3.]])
        matrix2 = tf.constant([[2.],[2.]])
        product = tf.matmul(matrix1, matrix2)
        ...

设备用字符串进行标识

"/cpu:0"
"/gpu:0" 第一个gpu
"/gpu:1" 第二个gpu,以此类推

在多个GPU的工作站上,每一个GPU的速度接近,我们选择一下的方式来设计训练系统:

  • 每个GPU上放单独的模型副本
  • 等所有GPU处理完一批数据后再同步更新模型的参数
    这里写图片描述
    如上图所示,每一个 GPU 会用一批独立的数据就算梯度和估计值,可以将一大批数据分割到各个 GPU 上。在 GPU 之间进行数据传输非常慢,所以在 CPU 上存储和更新所有模型的参数。GPU处理一批数据前会更新一批参数。
    session是与一个高效的 c++ 后端连接的

变量:创建,初始化,保存和加载
训练模型的时候,用变量来存储和更新参数
创建
讲一个张量作为初始值传入构造函数Varibable(),需要指定张量的 shape ,这个 shape 自动成为变量的shape.
初始化
变量的初始化必须在模型的其他操作前进行
在完全构建好模型并加载之后进行变量初始化
保存和加载
使用tf.train.Saver对象,构造器给 graph 的所有变量或是定义在列表里的变量,添加 save 和 restore 操作。
检查点文件,变量保存在二进制文件中,包含从变量名到 tensor 的映射关系
如果你不给tf.train.Saver()传入任何参数,那么saver将处理 graph 中所有的变量,每一个变量都以被创建时传入的名称被保存,为 python 字典。

Tensorboard可视化
通过给 ops 增加 summary 操作来输出数据,可以给每一个 summary 分配一个标签,创建的 summary 也是节点(ops),需要执行的时候才会运行。 tf.merge_all_summary 可以将这些summary ops 合并为一个 ops 。之后需要一个 tf.summary.FileWriter( log_dir , sess.graph) ,在指定目录创建一个 event file ,然后将 summares 和 events 写进去。

merged_summary_op = tf.merge_all_summaries()
summary_writer = tf.train.SummaryWriter('/tmp/mnist_logs', sess.graph)
total_step = 0
while training:
    total_step += 1
    session.run(training_op)
    if total_step % 100 == 0:
        summary_str = session.run(merged_summary_op)
        summary_writer.add_summary(summary_str, total_step)

名称域(name scoping)和节点(node)

import tensorflow as tf
    with tf.name_scope('hidden') as scope:
    a = tf.constant(5, name='alpha')
    W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0), name='weights')
    b = tf.Variable(tf.zeros([1]), name='biases')

结果是得到了三个操作名:

  • hidden/alpah
  • hidden/weights
  • hidden/biases

在图像化展示的时候 hidden 会展示为一个 ops ,可以通过点开它来看他的细节。
Tensorflow的图表有两种连线关系:数据依赖和控制依赖。数据以来表示两个操作直接的 tensor 流程,用实心箭头表示,控制依赖用点线表示。
图表显示中紫色是GPU,绿色是CPU

数据的读取
Tensorflow 提供了三个读取数据的方法:

  • 供给数据(Feeding): 在程序运行的每一步,让python 代码供给数据
  • 从文件中读取数据:在图的起始,让一个输入管线从文件中读取数据
  • 预加载数据:在图中定义常量和变量来保存所有的数据(仅用于数据量比较小的情况)

    供给数据:
    在图定义中使用 tf.placeholder() 定义数据ops ,placeholder节点的唯一意图就是提供数据供给(Feeding)的方法,此节点被定义的时候是未初始化的,不包含数据的,如果没有为他提供数据,Tensorflow 运算的时候会报错。
    使用python程序为placeholder提供值。

with tf.Session():
    input = tf.placeholder(tf.float32)
    classifier = ...
    print classifier.eval(feed_dict={input:my_python_preprocessing_fn()})

python代码输出数据

可以通过 tf.global_variables() 来获得全局变量

再启动一个session后,变量必须要先初始化

init = tf.initialize_all_variables()
sess.run(init)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值