Tf.nn.conv2d vs tf.layers.conv2d

Есть ли преимущество в использовании tf.nn.* над tf.layers.*?

Большинство примеров в документе используют tf.nn.conv2d, например, но неясно, почему они это делают.

Ответы

Ответ 1

Для свертки они одинаковы. Точнее, tf.layers.conv2d (фактически _Conv) использует tf.nn.convolution в качестве бэкэнда. Вы можете следовать цепочке вызовов: tf.layers.conv2d>Conv2D>Conv2D.apply()>_Conv>_Conv.apply()>_Layer.apply()>_Layer.\__call__()>_Conv.call()>nn.convolution()...

Ответ 2

Как упоминалось в GBY, они используют ту же реализацию.

Существует небольшая разница в параметрах.

Для tf.nn.conv2d:

filter: A Tensor. Must have the same type as input. A 4-D tensor of shape [filter_height, filter_width, in_channels, out_channels]

Для tf.layers.conv2d:

filters: Integer, the dimensionality of the output space (i.e. the number of filters in the convolution).

Я бы использовал tf.nn.conv2d при загрузке предварительно обработанной модели (пример кода: https://github.com/ry/tensorflow-vgg16) и tf.layers.conv2d для модели, подготовленной с нуля.

Ответ 3

Как уже упоминалось, параметры отличаются, особенно "фильтр (и)". tf.nn.conv2d принимает тензор в качестве фильтра, что означает, что вы можете указать снижение веса (или, возможно, другие свойства), как показано ниже в коде cifar10. (Хотите ли вы/должны иметь снижение веса в слое конвой - другой вопрос.)

kernel = _variable_with_weight_decay('weights',
                                     shape=[5, 5, 3, 64],
                                     stddev=5e-2,
                                     wd=0.0)
conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='SAME')

Я не совсем уверен, как установить снижение веса в tf.layers.conv2d, так как он принимает только целое число в качестве фильтров. Может быть, используя kernel_constraint?

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

Ответ 4

Все остальные ответы говорят о том, как отличаются параметры, но на самом деле главное отличие tf.nn и tf.layers conv2d заключается в том, что для tf.nn вам нужно создать свой собственный тензор фильтра и передать его. Этот фильтр должен иметь размер: [kernel_height, kernel_width, in_channels, num_filters]

Ответ 5

Посмотрите здесь: tenorflow> tf.layers.conv2d

и здесь: tenorflow> conv2d

Как вы можете видеть аргументы для версии слоев:

tf.layers.conv2d (входные данные, фильтры, kernel_size, strides = (1, 1), padding = 'valid', data_format = 'channel_last', dilation_rate = (1, 1), активация = нет, use_bias = True, kernel_initializer = Нет, bias_initializer = tf.zeros_initializer(), kernel_regularizer = Нет, bias_regularizer = Нет, activity_regularizer = Нет, обучаемый = True, имя = Нет, повторное использование = Нет)

и версия nn:

tf.nn.conv2d (вход, фильтр, шаги, заполнение, use_cudnn_on_gpu = нет, data_format = нет, имя = нет)

Я думаю, что вы можете выбрать тот, который вам нужен/нужен/нравится!

Ответ 6

ОТЛИЧИЯ В ПАРАМЕТРЕ:

Используя tf.nn * в коде:

# Convolution Layer with 32 filters and a kernel size of 5
conv1 = tf.layers.conv2d(x, 32, 5, activation=tf.nn.relu) 
# Max Pooling (down-sampling) with strides of 2 and kernel size of 2
conv1 = tf.layers.max_pooling2d(conv1, 2, 2)

Использование tf.nn * в коде: (Обратите внимание, мы должны передать вес и уклоны дополнительно в качестве параметров)

strides = 1
# Weights matrix looks like: [kernel_size(=5), kernel_size(=5), input_channels (=3), filters (= 32)]

# out = tf.nn.conv2d (входные данные, веса, отступы = "ТО ЖЕ ВРЕМЯ", шаги = [1, шаги, шаги, 1]) out = tf.nn.bias_add (out, bias) out = tf.nn.relu (из)