python - found - tf.nn.conv2d vs tf.layers.conv2d



install tensorflow mac (4)

¿Hay alguna ventaja en usar tf.nn.* sobre tf.layers.* ?

La mayoría de los ejemplos en el documento usan tf.nn.conv2d , por ejemplo, pero no está claro por qué lo hacen.


Como GBY mencionó, usan la misma implementación.

Hay una ligera diferencia en los parámetros.

Para 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]

Para tf.layers.conv2d:

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

Usaría tf.nn.conv2d al cargar un modelo pre-entrenado (código de ejemplo: https://github.com/ry/tensorflow-vgg16 ), y tf.layers.conv2d para un modelo entrenado desde cero.


Como otros mencionaron, los parámetros son diferentes, especialmente los "filtros". tf.nn.conv2d toma un tensor como filtro, lo que significa que puede especificar la disminución de peso (u otras propiedades) como la siguiente en el código cifar10 . (Si desea / necesita tener pérdida de peso en la capa conv es otra pregunta).

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')

No estoy muy seguro de cómo configurar la disminución de peso en tf.layers.conv2d ya que solo toma un número entero como filtros. Tal vez usando kernel_constraint ?

Por otro lado, tf.layers.conv2d maneja la activación y el sesgo automáticamente, mientras que tiene que escribir códigos adicionales para estos si usa tf.nn.conv2d.


Echa un vistazo aquí: tensorflow> tf.layers.conv2d

y aquí: tensorflow> conv2d

Como puede ver, los argumentos de la versión de capas son:

tf.layers.conv2d (entradas, filtros, kernel_size, strides = (1, 1), padding = 'valid', data_format = 'canales_last', dilation_rate = (1, 1), activación = Ninguno, use_bias = True, kernel_initializer = Ninguno, bias_initializer = tf.zeros_initializer (), kernel_regularizer = Ninguno, bias_regularizer = Ninguno, activity_regularizer = Ninguno, entrenable = Verdadero, nombre = Ninguno, reutilizar = Ninguno)

y la versión nn:

tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu = None, data_format = None, name = None)

¡Creo que puedes elegir el que tenga las opciones que quieras / necesites / gusten!


Para convolución, son lo mismo. Más precisamente, tf.layers.conv2d (en realidad _Conv ) usa tf.nn.convolution como back-end. Puede seguir la cadena de llamadas de: tf.layers.conv2d>Conv2D>Conv2D.apply()>_Conv>_Conv.apply()>_Layer.apply()>_Layer.\__call__()>_Conv.call()>nn.convolution()...





tensorflow