前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TF.Slim的repeat和stack操作

TF.Slim的repeat和stack操作

作者头像
狼啸风云
修改2022-09-03 20:28:11
8440
修改2022-09-03 20:28:11
举报

一、常规做法

在搭建网络时,TF-Slim 提供 repeat 和 stack,允许用户重复执行相同的 操作,方便网络构建,例如:

代码语言:javascript
复制
net = ...
net = slim.conv2d(net, 256, [3, 3], scope='conv3_1')
net = slim.conv2d(net, 256, [3, 3], scope='conv3_2')
net = slim.conv2d(net, 256, [3, 3], scope='conv3_3')
net = slim.max_pool2d(net, [2, 2], scope='pool2')

常见的作法:可用循环减少工作

代码语言:javascript
复制
net = ...
for i in range(3):
   net = slim.conv2d(net, 256, [3, 3], scope='conv3_%d' % (i+1))
   net = slim.max_pool2d(net, [2, 2], scope='pool2')

二、TF-Slim 中的 repeat 操作

使用 TF-Slim 中的 repeat 操作替代上边的定义:

代码语言:javascript
复制
net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3')
net = slim.max_pool2d(net, [2, 2], scope='pool2')

slim.repeat 会自动给每一个卷积层的scopes命名为’conv3/conv3_1’, ’conv3/conv3_2’ 和’conv3/conv3_3’

三、TF-Slim 中的 stack操作

TF-Slim 的 slim.stack 操作允许用户用不同的参数重复调用同一种操作 slim.stack 也为每一个被创建的操作创建一个新的 tf.variable_scope

代码语言:javascript
复制
# Verbose way:原始操作
x = slim.fully_connected(x, 32, scope='fc/fc_1')
x = slim.fully_connected(x, 64, scope='fc/fc_2')
x = slim.fully_connected(x, 128, scope='fc/fc_3')
     
# Equivalent , TF-Slim way using slim.stack:等价操作
slim.stack(x, slim.fully_connected , [32, 64, 128], scope='fc')
     
# slim.stack 调用了 slim.fully_connected 三次

看到repeat和stack在细节上有差异。具体查看文档

例子,定义vgg

代码语言:javascript
复制
def vgg16(inputs):
   with slim.arg_scope([slim.conv2d, slim.fully_connected],
   activation_fn=tf.nn.relu,
   weights_initializer=tf.truncated_normal_initializer(0.0, 0.01),
   weights_regularizer=slim.l2_regularizer(0.0005)):  # with之下
            net = slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scope='conv1')
            net = slim.max_pool2d(net, [2, 2], scope='pool1')
            net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv2')
            net = slim.max_pool2d(net, [2, 2], scope='pool2')
            net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3')
            net = slim.max_pool2d(net, [2, 2], scope='pool3')
            net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv4')
            net = slim.max_pool2d(net, [2, 2], scope='pool4')
            net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv5')
            net = slim.max_pool2d(net, [2, 2], scope='pool5')
            net = slim.fully_connected(net, 4096, scope='fc6')
            net = slim.dropout(net, 0.5, scope='dropout6')
            net = slim.fully_connected(net, 4096, scope='fc7')
            net = slim.dropout(net, 0.5, scope='dropout7')
            net = slim.fully_connected(net, 1000, activation_fn=None, scope='fc8')
return net

基于slim的vgg框架:

代码语言:javascript
复制
import tensorflow as tf
import tensorflow.contrib.slim.nets as nets
     
slim = tf.contrib.slim
vgg = nets.vgg
     
...
     
train_log_dir = ...
if not tf.gfile.Exists(train_log_dir):
        tf.gfile.MakeDirs(train_log_dir)
     
with tf.Graph().as_default():
        # Set up the data loading:
        images, labels = ...
     
        # Define the model:
        predictions = vgg.vgg_16(images, is_training=True)
     
        # Specify the loss function:
        slim.losses.softmax_cross_entropy(predictions , labels)
     
        total_loss = slim.losses.get_total_loss()
        tf.summary.scalar('losses/total_loss', total_loss)
     
        # Specify the optimization scheme:
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=.001)
     
        # create_train_op that ensures that when we evaluate it to get the loss,
        # the update_ops are done and the gradient updates are computed.
        train_tensor = slim.learning.create_train_op(total_loss , optimizer)
     
        # Actually runs training.
        slim.learning.train(train_tensor , train_log_dir)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、常规做法
  • 二、TF-Slim 中的 repeat 操作
  • 三、TF-Slim 中的 stack操作
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档