2018.07.03 代码总结

1.今天打算把ssd-tensorflow的训练和测试代码全部过一遍。在看到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)。
 
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就可以使代码更简练。
 
3.同时,像slim.conv2d,slim.fully_connected,slim.max_pool2d这些函数里都有一个参数叫outputs_collections,就是说做完了这些操作出来的结果都会添加到你设置的outputs_collections这个集合里。这样就比较方便我们去寻找模型每层出来的end_points。
 
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。
 
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)        #调用相关属性的话,只需要用"对象.属性"调用即可

6. 下载SSD-Tensorflow代码

git clone https://github.com/balancap/SSD-Tensorflow.git
posted @ 2018-07-03 17:33  rockalmighty  阅读(276)  评论(0编辑  收藏  举报