tf中slim的使用

https://blog.csdn.net/Cyiano/article/details/75006883

https://blog.csdn.net/transMaple/article/details/78273560

slim库是tensorflow中的一个高层封装,它将原来很多tf中复杂的函数进一步封装,省去了很多重复的参数,以及平时不会考虑到的参数。可以理解为tensorflow的升级版。

导入方式:

import tensorflow as tf
import tensorflow.contrib.slim as slim

Layers:

参数:

# 所有的参数如下
@add_arg_scope
def convolution2d_in_plane(
    inputs,
    kernel_size,
    stride=1,
    padding=‘SAME‘,
    activation_fn=nn.relu,
    normalizer_fn=None,
    normalizer_params=None,
    weights_initializer=initializers.xavier_initializer(),
    weights_regularizer=None,
    biases_initializer=init_ops.zeros_initializer(),
    biases_regularizer=None,
    reuse=None,
    variables_collections=None,
    outputs_collections=None,
    trainable=True,
    scope=None):
input = ...
net = slim.conv2d(input, 128, [3, 3], scope=‘conv1_1‘)
net = slim.max_pool2d(net, kernel_size=[2,2], stride=2, scope=‘pool1‘)
# 一般为 (inputs=?, kernel_size=?, stride=?, padding=?, ....)
net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope=‘conv3‘)
# repeat操作即为重复创建某个layer

slim.conv2d

slim.conv2d是基于tf.conv2d的进一步封装,省去了很多参数,一般调用方法如下:

net = slim.conv2d(inputs, 256, [3, 3], stride=1, scope=‘conv1_1‘)

前三个参数依次为网络的输入输出的通道卷积核大小,stride是做卷积时的步长。除此之外,还有几个经常被用到的参数:

padding : 补零的方式,例如‘SAME‘
activation_fn : 激活函数,默认是nn.relu
normalizer_fn : 正则化函数,默认为None,这里可以设置为batch normalization,函数用slim.batch_norm
normalizer_params : slim.batch_norm中的参数,以字典形式表示
weights_initializer : 权重的初始化器,initializers.xavier_initializer()
weights_regularizer : 权重的正则化器,一般不怎么用到
biases_initializer : 如果之前有batch norm,那么这个及下面一个就不用管了
biases_regularizer :
trainable : 参数是否可训练,默认为True

slim.max_pool2d

这个函数更简单了,用法如下:

net = slim.max_pool2d(net, [2, 2], scope=‘pool1‘)

slim.fully_connected

slim.fully_connected(x, 128, scope=‘fc1‘)

slim.arg_scope

slim.arg_scope可以定义一些函数的默认参数值,在scope内,我们重复用到这些函数时可以不用把所有参数都写一遍。

with slim.arg_scope([slim.conv2d, slim.fully_connected],
                    trainable=True,
                    activation_fn=tf.nn.relu,
                    weights_initializer=tf.truncated_normal_initializer(stddev=0.01),
                    weights_regularizer=slim.l2_regularizer(0.0001)):
    with slim.arg_scope([slim.conv2d],
                        kernel_size=[3, 3],
                        padding=‘SAME‘,
                        normalizer_fn=slim.batch_norm):
        net = slim.conv2d(net, 64, scope=‘conv1‘))
        net = slim.conv2d(net, 128, scope=‘conv2‘))
        net = slim.conv2d(net, 256, [5, 5], scope=‘conv3‘))

batch normalization的问题

接下来说我在用slim.batch_norm时踩到的坑。slim.batch_norm里有moving_mean和moving_variance两个量,分别表示每个批次的均值和方差。在训练时还好理解,但在测试时,moving_mean和moving_variance的含义变了。在训练时,有一些语句是必不可少的:

# 定义占位符,X表示网络的输入,Y表示真实值label
X = tf.placeholder("float", [None, 224, 224, 3])
Y = tf.placeholder("float", [None, 100])

#调用含batch_norm的resnet网络,其中记得is_training=True
logits = model.resnet(X, 100, is_training=True)
cross_entropy = -tf.reduce_sum(Y*tf.log(logits))

#训练的op一定要用slim的slim.learning.create_train_op,只用tf.train.MomentumOptimizer.minimize()是不行的
opt = tf.train.MomentumOptimizer(lr_rate, 0.9)
train_op = slim.learning.create_train_op(cross_entropy, opt, global_step=global_step)

#更新操作,具体含义不是很明白,直接套用即可
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
if update_ops:
    updates = tf.group(*update_ops)
    cross_entropy = control_flow_ops.with_dependencies([updates], cross_entropy)

之后的训练都和往常一样了,导出模型后,在测试阶段调用相同的网络,参数is_training一定要设置成False。

logits = model.resnet(X, 100, is_training=False)

否则,可能会出现这种情况:所有的单个图像分类,最后几乎全被归为同一类。这可能就是训练模式设置反了的问题。

原文地址:https://www.cnblogs.com/fighting929/p/10874868.html

时间: 2024-09-30 23:58:04

tf中slim的使用的相关文章

tf.contrib.slim的介绍

本文主要参考博客:博客连接 前言基础: 验证本地的tf.contrib.slim模块是否有效: 1 python -c "import tensorflow.contrib.slim as slim;eval=slim.evaluation.evaluate_once" 下载models模块: 下载连接.下载后解压到你设定的文件夹,笔者解压到"E:\TENSORFLOW\models" 找到并且打开文件夹"E:\TENSORFLOW\models\rese

tf.contrib.slim.arg_scope 完整

缘由 最近一直在看深度学习的代码,又一次看到了slim.arg_scope()的嵌套使用,具体代码如下: with slim.arg_scope( [slim.conv2d, slim.separable_conv2d], weights_initializer=tf.truncated_normal_initializer( stddev=weights_initializer_stddev), activation_fn=activation_fn, normalizer_fn=slim.b

tf.contrib.slim.data数据加载 综述

TF-Slim为了方便加载各种数据类型(如TFRocords或者文本文件)的数据,创建了这个库. Dataset 这里的数据库与通常意义下数据库是不同的,这里数据库是python一个类,它负责将原始数据通过流水线加工成为我们需要的数据格式. TF-Slim defines a dataset to be a set of files (that may or may not be encoded) representing a finite set of samples, and which c

第二十二节,TensorFlow中的图片分类模型库slim的使用

Google在TensorFlow1.0,之后推出了一个叫slim的库,TF-slim是TensorFlow的一个新的轻量级的高级API接口.这个模块是在16年新推出的,其主要目的是来做所谓的"代码瘦身".它类似我们在TensorFlow模块中所介绍的tf.contrib.lyers模块,将很多常见的TensorFlow函数进行了二次封装,使得代码变得更加简洁,特别适用于构建复杂结构的深度神经网络,它可以用了定义.训练.和评估复杂的模型. 这里我们为什么要过来介绍这一节的内容呢?主要是

图融合之加载子图:Tensorflow.contrib.slim与tf.train.Saver之坑

import tensorflow as tf import tensorflow.contrib.slim as slim import rawpy import numpy as np import tensorflow as tf import struct import glob import os from PIL import Image import time __sony__ = 0 __huawei__ = 1 __blackberry__ = 2 __stage_raw2ra

TensorFlow和最近发布的slim

笔者将和大家分享一个结合了TensorFlow和最近发布的slim库的小应用,来实现图像分类.图像标注以及图像分割的任务,围绕着slim展开,包括其理论知识和应用场景. 之前自己尝试过许多其它的库,比如Caffe.Matconvnet.Theano和Torch等.它们各有优劣,而我想要一个可靠灵活的.自带预训练模型的python库.最近,新推出了一款名叫slim的库,slim自带了许多预训练的模型,比如ResNet.VGG.Inception-ResNet-v2(ILSVRC的新赢家)等等.这个

『TensorFlow』slim高级模块

『TensorFlow』徒手装高达_主机体框架开光版_Google自家AlexNet集成&slim高级模块学习 辅助函数 slim.arg_scope() slim.arg_scope可以定义一些函数的默认参数值,在scope内,我们重复用到这些函数时可以不用把所有参数都写一遍,注意它没有tf.variable_scope()划分图结构的功能, with slim.arg_scope([slim.conv2d, slim.fully_connected], trainable=True, act

ROS TF——learning tf

在机器人的控制中,坐标系统是非常重要的,在ROS使用tf软件库进行坐标转换. 相关链接:http://www.ros.org/wiki/tf/Tutorials#Learning_tf 一.tf简介 我们通过一个小小的实例来介绍tf的作用. 1.安装turtle包 $ rosdep install turtle_tf rviz $ rosmake turtle_tf rviz 2.运行demo 运行简单的demo: $ roslaunch turtle_tf turtle_tf_demo.lau

TensorFlow与caffe中卷积层feature map大小计算

刚刚接触Tensorflow,由于是做图像处理,因此接触比较多的还是卷及神经网络,其中会涉及到在经过卷积层或者pooling层之后,图像Feature map的大小计算,之前一直以为是与caffe相同的,后来查阅了资料发现并不相同,将计算公式贴在这里,以便查阅: caffe中: TF中: 参考: http://blog.csdn.net/lujiandong1/article/details/53728053 http://www.cnblogs.com/denny402/p/5071126.h