Tensorflow slim库使用小记

TensorFlow高层封装-Slim,Keras,Estimator 现在比较流行的tensorflow高层封装主要有4个,分别是Slim,TFLearn,Keras,Estimator. 使用tf.slim在MNIST数据集上实现LeNet-5模型 import tensorflow as tf import tensorflow.contrib.slim as slim import numpy as np from tensorflow.examp... 阅读详情

转自:https://blog.youkuaiyun.com/Cyiano/article/details/75006883

Tensorflow slim库使用小记


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

导入方式:

import tensorflow as tf
import tensorflow.contrib.slim as slim
  • 1
  • 2

常用函数

slim.conv2d

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

net = slim.conv2d(inputs, 256, [3, 3], stride=1, scope='conv1_1')
  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

slim.max_pool2d

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

net = slim.max_pool2d(net, [2, 2], scope='pool1')
  • 1

slim.fully_connected

slim.fully_connected(x, 128, scope='fc1')
  • 1

前两个参数分别为网络输入、输出的神经元数量。

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'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

slim.arg_scope的用法基本都体现在上面了。一个slim.arg_scope内可以用list来同时定义多个函数的默认参数(前提是这些函数都有这些参数),另外,slim.arg_scope也允许相互嵌套。在其中调用的函数,可以不用重复写一些参数(例如kernel_size=[3, 3]),但也允许覆盖(例如最后一行,卷积核大小为[5,5])。 
另外,还可以把这么多scope封装成函数:

def new_arg_sc():
    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) as sc:
            return sc

def main():
    ......
    with slim.arg_scope(new_arg_sc()):
        ......
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

logits = model.resnet(X, 100, is_training=False)
使用openMVS对样例数据进行重建 openMVS根据github上的步骤进行编译。注意,如果没有GPU,用不了CUDA的话,那么需要在openMVS目录下找到CmakeLists.txt文件,把CUDA设置为OFF: SET(OpenMVS_USE_CUDA OFF CACHE BOOL "Enable CUDA library") 可执行的文件生成在openMVS_build/bin/里面,在openMVS_build文件夹下打开终端,按照顺序执行如下命令即可逐步重建。其中,-w 设置的是数据的总路径,-i 后接输入的文件名,-o 阅读详情

相关推荐

ns3-gym入门(二):linear-mesh例子详解

学习ns3-gym中关于IEEE 802.11网状网络中控制随机接入的例子linear-mesh

zoe2222226666的博客 1843

Slim下的函数介绍(一)

1、slim.conv2d:二维卷积 2、slim.nets.resnet_utils.conv2d_same():使用“SAME”填充的二维卷积 3、 tf.variable_scope()的original_name_scope 和 name的区别: 4、slim.utils.collect_named_outputs(collections, alias, outputs):为outp...

蓬莱道人的博客 2万+

CANopen中SDO、PDO字典以及COB-ID理解

CANopen SDO PDO

sunarmy的专栏 2万+

torch.nn.Conv2d()与slim.conv2d()函数参数详解

步长,即卷积核在与图像做卷积的过程中每次移动的距离,一般定义为[1,stride_h,stride_w,1],stride_h与stride_w分别表示在高的方向和宽的方向的移动的步长,第一个1表示在batch上移动的步长,最后一个1表示在通道维度移动的步长,而目前tensorflow规定:strides[0] = strides[3] = 1,即不允许跳过bacth和通道,前面的动态图中的stride_h与stride_w均为1。输入的tensor,被卷积的图像,conv2d要求input必须是四维的。

daijingxin的博客 1431

COLMAP生成MVSNet数据集

COLMAP生成MVSNet数据集

qq_43307074的博客 5637

别再为域名备案发愁了!微信小程序后端调用,试试这个‘官方捷径’——云托管

本文介绍了微信小程序后端部署的新思路——利用微信云托管服务绕过域名备案难题。通过详细的环境准备、数据库配置、服务部署和小程序端调用方案,帮助开发者快速实现小程序与后端服务的无缝对接,大幅缩短上线周期并降低运维成本。

weixin_29243279的博客 674

slim.conv2d

slim.conv2d 自带卷积和激励函数 slim.conv2d 带batch_norm的方式: slim.max_pool2d slim.arg_scope():用于设置一些变量, 上面两句等于下面的: slim.conv2d的两种操作方式:卷积核设置    ...

DRACOYU的博客 9552

STM32 CubeMX实战:手把手教你用I2C驱动IST8310磁力计(附完整代码)

本文详细介绍了如何使用STM32 CubeMX和I2C驱动IST8310磁力计,从硬件连接到代码实现的完整流程。重点讲解了I2C通信异常处理、传感器初始化序列优化以及中断驱动数据采集方案,帮助开发者快速搭建可靠的地磁场数据采集系统。

weixin_42531163的博客 189

tensorflow的高级封装slim

Tensorflow slim库使用小记slim库是tensorflow中的一个高层封装,它将原来很多tf中复杂的函数进一步封装,省去了很多重复的参数,以及平时不会考虑到的参数。可以理解为tensorflow的升级版。导入方式:?12import tensorflow as tfimport tensorflow.contrib.slim as slim常用函数slim.conv2dslim.co...

一路向北 749

关于mos管的压降问题(项目遇到问题总结)

在研发过程中没有出现问题的板子,到了小批时竟出现雷达一直在触发???找了大几天,没有头绪。心中疑惑颇多,加上老板催促,自考等原因,真是压力山大。4月份自考,只有差不多一个月时间了吧,没有什么大的收获,反而在查找硬件问题的过程中,发现了一个自己忽视的一个问题,就是关于Mos管的压降问题。 备考的过程崎岖不平,工作又问题多多,孰轻孰重,如何取舍?从心理来说,不想取舍什么,只是有所得就可以,过不了就过不了呗,已经毕业十五年了,没这个本科文凭不也过来了吗?只是代表了自己在这一段时间的思考,自己兴趣吧,没什么大不了

guangod的博客 2万+

形状记忆合金热机械本构模型的ABAQUS子程序实现与Fortran\_ABAQUS编程实践

本文详细介绍了如何使用ABAQUS子程序实现形状记忆合金的热机械本构模型,并通过Fortran_ABAQUS进行编程实践。我们首先介绍了问题的背景和目标,然后讲解了如何在Fortran_ABAQUS子程序中实现热变形模型、应力应变关系和相变模型,最后进行了ABAQUS模拟,并分析了模拟结果。希望通过本文的讲解,能让大家更深入理解ABAQUS子程序以及Fortran的使用,也希望能对大家在进行相关学习或研究工作时提供一些帮助。

qq_38334677的博客 1327

非csdn收藏1

https://www.jianshu.com/p/5a404f1addea学习笔记TF004:张量表示、类型、形状、计算 https://my.oschina.net/u/780234/blog/1588827tensorflow常用函数之tf.nn.softmax https://www.jianshu.com/p/a8f0b9c9dc58tensorflow命令行参数 https://...

qq_37573479的博客 104

ProgLoss+STAL 技术详解:YOLO26 小目标检测增强方案

本文提出了一种基于ProgLoss渐进式损失函数和STAL小目标感知标签分配的YOLO26增强方案。针对小目标检测中特征信息少、正负样本不平衡等难题,STAL通过尺度感知的标签分配策略动态调整候选样本数量和IoU阈值,为小目标分配更多正样本;ProgLoss则根据训练阶段动态调整分类和回归损失的权重,早期侧重定位能力,后期加强分类精度。实验表明,该组合方案显著提升了小目标检测性能,在COCO数据集上小目标AP达到38.2%,比基线提升6.5个百分点。该方法为遥感、监控等场景的小目标检测提供了有效解决方案。

一键难忘的博客 1284

TensorFlow基础笔记(11) conv2D函数

#链接:http://www.jianshu.com/p/a70c1d931395 import tensorflow as tf import tensorflow.contrib.slim as slim # tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None) # ...

weixin_30947043的博客 266

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Tensorflow-slim 学习笔记(一)概述

TF-Slim的优势:slim作为一种轻量级的tensorflow库,使得模型的构建,训练,测试都变得更加简单。 1. 使用方法: import tensorflow.contrib.slim as slim 2. 组成部分: arg_scope: 使得用户可以在同一个arg_scope中使用默认的参数 data,evaluation,layers,learnin...

weixin_30615767的博客 639

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TensorFlow之高层封装(TensorFlow-Slim、TFLearn、Keras、Estimator)学习总结

作者:jliang https://blog.youkuaiyun.com/jliang3 说明:以下所有代码使用版本TensorFlow1.4.0或1.12.0版本 import tensorflow as tf print(tf.__version__) 1.12.0 10.TensorFlow高层封装 TensorFlow的高层封装有很多 10.1 TensorFlow高层封装总...

jliang3的博客 2582

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

slim.conv2d以及slim.convolution2d与tf.nn.conv2d的不同

前言 Slim是一个简化构建,训练和评估神经网络的库: 允许用户通过消除样板代码来更紧凑地定义模型。 这是通过使用参数范围和许多高级层和变量来实现的。 这些工具提高了可读性和可维护性,降低了复制和粘贴超参数值的错误发生的可能性,并简化了超参数调整。 通过提供常用的正则化器使开发模型变得简单。 Slim可以轻松扩展复杂模型,并通过使用预先存在的模型检查点来热启动训练算法。 首先slim.c...

m0_37477175的博客 7625

slim各模块介绍

转载这篇博客。

wyz6666的博客 987

【Tensorflow】Tensorflow中的卷积函数(conv2d、slim.conv2d、depthwise_conv2d、conv2d_transpose)

前言   卷积是卷积神经网络中最主要、最重要的运算。想必大家最早接触卷积的概念就是在初高中的数学当中,它是一个这样的公式; (g∗h)(x)=∫−∞∞g(τ)⋅h(x−τ)dτ(g\ast h)(x)=\int_{-\infty }^{\infty }g(\tau )\cdot h(x-\tau )d\tau (g∗h)(x)=∫−∞∞​g(τ)⋅h(x−τ)dτ   上面的公式是一维空间中连续函...

不用先生的博客 8760

TensorFlow 之 高层封装slim,tflearn,keras

tensorflow资源整合 使用原生态TensorFlow API来实现各种不同的神经网络结构。虽然原生态的TensorFlow API可以很灵活的支持不同的神经网络结构,但是其代码相对比较冗长,写起来比较麻烦。为了让TensorFlow用起来更加方便,可以使用一些TensorFlow的高层封装。 目前对TensorFlow的主要封装有4个: 第一个是TensorFlow-Slim; 第...

weixin_34075268的博客 304

tf.contrib.slim.conv2d()

convolution(inputs, num_outputs, kernel_size, stride=1, padding='SAME', data_format=None, rate=1, act...

weixin_36670529的博客 679

转载 slim下的函数使用

1、slim.conv2d:二维卷积 2、slim.nets.resnet_utils.conv2d_same():使用“SAME”填充的二维卷积 3、 tf.variable_sc...

waittingforyou12的博客 597
上一篇: CNN 模型压缩与加速算法综述
下一篇: 准确率,召回率,F1 值、ROC,AUC、mse,mape评价指标
class_brick
博客等级 码龄12年 223粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值