TensorFlow 学习笔记(二)

1、
slim.get_variables(),slim.get_model_variables(),tf.global_variables(),tf.trainable_variables(),tf.all_variables()
[989,446,989,270,989]

  1. tf.GraphKeys.GLOBAL_VARIABLES:可以在多个设备上共享的变量
  2. tf.GraphKeys.TRAINABLE_VARIABLES:计算其梯度的变量
  3. model_variables():Model variables are trained or fine-tuned during learning and are loaded from a checkpoint during evaluation or inference。对于像global_step这种在训练时用到但是在推理时候用不到的变量则不是model变量
  4. regular_variables_and_model_variables = slim.get_variables()这条指令执行的是获得所有的regular变量和model变量,
  5. regular变量是什么呢::they can be saved to disk using a saver。其实就是global变量
  6. model variable和trainable variable的区别在前者含有moving_mean和moving_variance两个变量
import tensorflow as tf
import tensorflow.contrib.slim as slim
my_non_trainable = tf.get_variable("my_non_trainable",
                                   shape=(),
                                   trainable=False)
my_trainable = tf.get_variable("my_trainable",
                                   shape=(),
                                   trainable=True)
weights = slim.model_variable('weights',
                              shape=[10, 10, 3 , 3],
                              initializer=tf.truncated_normal_initializer(stddev=0.1),
                              regularizer=slim.l2_regularizer(0.05),
                              device='/CPU:0')
print('slim.get_variables',slim.get_variables())
print('slim.get_model_variables',slim.get_model_variables())
print('tf.global_variables',tf.global_variables())
print('tf.trainable_variables',tf.trainable_variables())

这里写图片描述

  • 如果建立一个变量是的trainable=False的话,那么该变量不会出现在trainable的变量集合中,也不会出现在model变量集合中,但是都会是global变量
  • 只要是tf.get_variable的方式建立的变量都不会成为model variable

那么什么样子的变量才有资格成为model variable?

import tensorflow as tf
import tensorflow.contrib.slim as slim
from tensorflow.contrib import layers as layers_lib
input = tf.zeros([1,64,64,3])
net = slim.conv2d(input, 128, [3, 3], scope='conv1_1')
net1 = layers_lib.conv2d(
        input,
        128,
        [3,3],
        stride=1,
        padding='SAME',
        scope='conv2-1')
print('slim.get_variables',slim.get_variables())
print('slim.get_model_variables',slim.get_model_variables())
print('tf.global_variables',tf.global_variables())
print('tf.trainable_variables',tf.trainable_variables())

print('slim.get_variables',len(slim.get_variables()))
print('slim.get_model_variables',len(slim.get_model_variables()))
print('tf.global_variables',len(tf.global_variables()))
print('tf.trainable_variables',len(tf.trainable_variables()))

这里写图片描述

  • 由实验可以发现,通过建立层之类的操作获得的变量,不论是slim还是contrib.layers创立的,都会是model variable,也是trainable variable,也是global variable
  • 由slim.model_variable创建的变量是model variable,通过variable和get_variable方式建立的都不是model_variable

3、如何打印加在的模型中的都含有哪些变量
通过打印可以知道,只要saver保存的时候没有指明保存哪些变量的话,最后保存的是所有的global variable。
1)

import os
from tensorflow.python import pywrap_tensorflow

path = "/home/lzhou/tf-ll/logs/tmp/model_dump/snapshot_2.ckpt"
reader = pywrap_tensorflow.NewCheckpointReader(path)
var_to_shape_map = reader.get_variable_to_shape_map()
for key in var_to_shape_map:
    print("tensor_name: ", key)
    print(reader.get_tensor(key))

2)

from tensorflow.python.tools import inspect_checkpoint as chkp
path = "/home/lzhou/tf-ll/logs/tmp/model_dump/snapshot_2.ckpt"
chkp.print_tensors_in_checkpoint_file(path, tensor_name='', all_tensors=True)

4、
对于用卷积之类的隐式地创建的变量来讲,他以自己所在的卷积scope参数为前缀,不受之前name_scope的影响。对于用卷积等一系列操作进行的变量创建的话他的命名都不受name_scope的影响,但是却受variable_scope的影响print(net.name)这句话输出的是返回的op的名字,受对应name_scope影响,如果将net = slim.conv2d(input, 128, [3, 3], scope='conv1_1')改为net = slim.conv2d(input, 128, [3, 3], scope='conv1-1'),则会产生命名重复这样的冲突,此时就必须使用变量共享了。

with tf.name_scope('tower_1') as name_scope:
  with tf.device('/gpu:2'):
    with slim.arg_scope([slim.model_variable, slim.variable],regularizer=slim.l2_regularizer(0.05)):
      input = tf.zeros([1,64,64,3])
      net = slim.conv2d(input, 128, [3, 3], scope='conv1_1')
      net1 = layers_lib.conv2d(
              input,
              128,
              [3,3],
              stride=1,
              padding='SAME',
              scope='conv1-1')
      print(net.name)
      print(net1.name)
for ii in range(len(slim.get_model_variables())):
  print(slim.get_model_variables()[ii].device,slim.get_model_variables()[ii].name)

这里写图片描述
如果不指定conv2d的scope参数,那么程序自动命名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值