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的区别


    • 前言
    • 对比
    • 参考

你可能感兴趣的:(深度学习笔记)