Разница между tf.layers.conv2d и tf.contrib.slim.conv2d - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь преобразовать сеть, которую я использую, из использования conv2d tf-slim в использование tf.layers.conv2d, так как похоже, что tf.layers - более поддерживаемый и перспективный вариант. Сигнатуры функций довольно похожи, но есть ли что-то алгоритмически различное между ними? Я получаю размеры выходного тензора, отличные от ожидаемых.

x = tf.layers.conv2d(inputs=x,
                     filters=256,
                     kernel_size=[3,3],
                     trainable=True)

В противоположность этому:

x = slim.conv2d(x, 256, 3)

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Я получаю размеры выходного тензора, отличные от ожидаемых.

Это связано с тем, что по умолчанию для slim.conv2d используется то же самое заполнение, а для tf.layers.conv2dдопустимое заполнение.

Если вы хотите воспроизвести точно такое же поведение, вот правильная реализация:

x = tf.layers.conv2d(x, 256, 3, padding='same')
0 голосов
/ 11 сентября 2018

Описание tf.slim пакета *1002* проливает немного больше света на различия: В частности, если вы посмотрите под «Слои», можно найти следующее:

Слои

Хотя набор операций TensorFlow довольно обширный, разработчики нейронных сетей обычно думают о моделях с точки зрения более высокого уровня такие понятия, как «слои», «потери», «метрики» и «сети». Слой, такие как сверточный слой, полностью связанный слой или BatchNorm Слой является более абстрактным, чем одна операция TensorFlow и как правило, включают в себя несколько операций. Кроме того, слой обычно (но не всегда) имеет переменные (настраиваемые параметры), связанные с это, в отличие от более примитивных операций. Например, сверточный Уровень в нейронной сети состоит из нескольких операций низкого уровня:

  • Создание переменных веса и смещения
  • Свертка весов с входом из предыдущего слоя
  • Добавление смещений к результату свертки.
  • Применение функции активации.

Используя только простой код TensorFlow, это может быть довольно трудоемким:

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)

Чтобы облегчить необходимость многократного дублирования этого кода, TF-Slim обеспечивает ряд удобных операций, определенных на более абстрактный уровень нейросетевых слоев. Например, сравните код выше для вызова соответствующего кода TF-Slim:

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

Короче говоря, операторы slim делают некоторые аккуратные абстракции для вас, чтобы вам не пришлось беспокоиться обо всех мельчайших деталях TensorFlow - хорошее дополнение, если вы спросите меня. Кажется, однако, что это все еще находится в активной разработке, поэтому я хотел бы прочитать немного больше об этом, прежде чем активно использовать его в (перспективной) разработке.

...