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

前言

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

  2. 首先slim.conv2d与slim.convolution2d是一模一样的,可参考源码:
    https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/layers/python/layers/layers.py

# Simple alias.
conv1d = convolution1d
conv2d = convolution2d
conv3d = convolution3d
conv2d_transpose = convolution2d_transpose
conv3d_transpose = convolution3d_transpose
conv2d_in_plane = convolution2d_in_plane
separable_conv2d = separable_convolution2d

接下来我们讨论slim.conv2d以及tf.nn.conv2d的不同点。

对比

这两个函数都是用来构造卷积层的函数封装。
虽然TensorFlow操作集非常广泛,但神经网络的开发人员通常会根据更高级别的概念来考虑模型,例如“层”,“损失”,“度量”和“网络”。 诸如卷积层,完全连接层或BatchNorm层之类的层比单个TensorFlow操作更抽象,并且通常涉及多个操作。 此外,与更原始的操作不同,层通常(但不总是)具有与之关联的变量(可调参数)。 例如,神经网络中的卷积层由几个低级操作组成:

  • 创建权重和偏差变量
  • 使用前一层的输入来计算权重
  • 将偏差添加到卷积的结果中。
  • 激活函数。

使用tf.nn.conv2d创建一个完整的卷积层如下所示:

input = ...
with tf.name_scope('conv1_1') as scope:
  kernel = tf.Variable(tf.truncated_normal([3, 3, 64, 128], dtype=tf.float32,
                                           stddev=1e-1), name='weights')
  conv = tf.nn.conv2d(input, kernel, [1, 1, 1, 1], padding='SAME')
  biases = tf.Variable(tf.constant(0.0, shape=[128], dtype=tf.float32),
                       trainable=True, name='biases')
  bias = tf.nn.bias_add(conv, biases)
  conv1 = tf.nn.relu(bias, name=scope)

变量的创建以及相关操作过于复杂

而使用slim.conv2d创建如下:

input = ...
net = slim.conv2d(input, 128, [3, 3], scope='conv1_1')

一句就可以了。

参考

1 :https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/layers/python/layers/layers.py
2 :tf.nn.conv2d和tf.contrib.slim.conv2d的区别


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`slim.conv2d`是TensorFlowSlim框架中的卷积层函数,而`tensorflow.keras.layers.conv2d`是TensorFlow中Keras框架中的卷积层函数。 两者所提供的功能都是实现2D卷积层,但是使用方式和参数设置不同: `slim.conv2d`: ```python slim.conv2d(inputs, num_outputs, kernel_size, stride=1, padding='SAME', activation_fn=tf.nn.relu, normalizer_fn=None, weights_initializer=tf.truncated_normal_initializer(stddev=0.1), biases_initializer=tf.zeros_initializer(), scope=None) ``` 其中各参数含义为: - `inputs`:输入的tensor - `num_outputs`:卷积核的数量,也就是输出的通道数 - `kernel_size`:卷积核大小 - `stride`:卷积核滑动步长,默认为1 - `padding`:卷积层补零的方式,可以设置为`SAME`或者`VALID` - `activation_fn`:激活函数,默认为ReLu - `normalizer_fn`:正则化函数,如BN层 - `weights_initializer`:权重初始化函数 - `biases_initializer`:偏置初始化函数 - `scope`:变量作用域 `tensorflow.keras.layers.conv2d`: ```python tf.keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None, **kwargs) ``` 其中各参数含义为: - `filters`:输出的通道数 - `kernel_size`:卷积核的大小 - `strides`:卷积核滑动步长,默认为(1,1) - `padding`:卷积层补零方式,默认为`valid` - `activation`:激活函数,默认为`None` - `use_bias`:是否使用偏置 - `kernel_initializer`:权重初始化函数 - `bias_initializer`:偏置初始化函数 - `kernel_regularizer`:权重正则化函数 - `bias_regularizer`:偏置正则化函数 - `activity_regularizer`:输出正则化函数 - `kernel_constraint`:权重约束函数 - `bias_constraint`:偏置约束函数 总的来说,`tensorflow.keras.layers.conv2d`提供了更多的参数设置选项,控制更加细致,但对于简单的应用场景,`slim.conv2d`更简单方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值