slim一些事

slim.utils.convert_collection_to_dict

1.nets/vgg.py中的vgg_16时,出现了一个slim.utils.convert_collection_to_dict(end_points_collection),但实际上slim里没有utils这个模块,估计是由于版本更新了(我的版本是tf1.8),后来在这个项目的其它文件中看到utils是这样导入的:

from tensorflow.contrib.layers.python.layers import utils

utils.convert_collection_to_dict的作用和tf.get_collection类似,主要就是获得一个collection里的所有tensor。但是它和tf.get_collectoin单纯地返回tensor的list不同的地方在于,convert_collection_to_dict会将tensor以字典的形式返回,而字典的key是tensor的别名(alias)

slim.arg_scope

2.我在看vgg_16的构建的代码的时候也总算把slim的arg_scope搞懂了(之前学slim的时候没搞懂,后来就没再去理它了,但是现在回头来看,这个概念还是很好懂的啊,不知道为什么自己当时没搞明白)。总得来说,slim.arg_scope的作用就是给函数设置一些默认参数:

with slim.arg_scope([slim.conv2d, slim.fully_connected], trainable = True, activation_fn = None, weights_initializer = tf.truncated_normal_initializer(stddev=0.01)): 
    net = slim.conv2d(net, 64, [3, 3], scope = 'conv1') 
    net = slim.fully_connected(net, 32, scope = 'fc1')

上面这段代码,如果不用slim.arg_scope的话,需要写成下面这样:

net = slim.conv2d(net, 64, [3, 3], trainable = True, activation_fn = None, weights_initializer = tf.truncated_normal_initializer(stddev=0.01)) 
net = slim.fully_connectd(net, 32, trainable = True, activation_fn = None, weights_initializer =tf.truncated_normal_initializer(stddev=0.01))

如果像上面这样的话,如果模型的层数较多的话,代码重复就会比较多。因此用slim.arg_scope就可以使代码更简练。

outputs_collections

像slim.conv2d,slim.fully_connected,slim.max_pool2d这些函数里都有一个参数叫outputs_collections,就是说做完了这些操作出来的结果都会添加到你设置的outputs_collections这个集合里。这样就比较方便我们去寻找模型每层出来的end_points。

tf.nn.l2_normalize

4.tf.nn.l2_normalize(x, axis = None, epsilon = 1e-12)这个函数其实就是对x做l2正则化处理,假如x是一维tensor的话,那么

output = x/sqrt(max(sum(x**2), epsilon))

其中的axis指明了l2正则化这个操作是在哪一维进行的。如果输入的x是[batch_size, height, width, channel]的图片的话,我们需要做正则化的应该是channel那一维,也就是axis=3。

slim.dataset.Dataset

5.看了一下slim.dataset.Dataset的定义,发现它不过是简单地把dataset的各个属性封装一下的类。看了以后收获也还是很大的,比如说更新类别的属性可以用下面的代码

def __init__(self, data_sources, reader, decoder, num_samples, items_to_descriptions, **kwargs): 
    kwargs['data_sources'] = data_sources 
    kwargs['reader'] = reader 
    kwargs['decoder'] = decoder 
    kwargs['num_samples'] = num_samples 
    kwargs['items_to_descriptions'] = items_to_descriptions 
    self.__dict__.update(kwargs) #调用相关属性的话,只需要用"对象.属性"调用即可
 
SSD-Tensorflow: git clone https://github.com/balancap/SSD-Tensorflow.git

猜你喜欢

转载自blog.csdn.net/weixin_39875161/article/details/92396230