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 (из)