For convolution, they are the same. More precisely, tf.layers.conv2d (actually _Conv) uses tf.nn.convolution as the backend
they use the same implementation.
There is a slight difference in the parameters.For 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]
https://www.tensorflow.org/api_docs/python/tf/nn/conv2d
filters: Integer, the dimensionality of the output space (i.e. the number of filters in the convolution).
https://www.tensorflow.org/api_docs/python/tf/layers/conv2d
I would use tf.nn.conv2d when loading a pretrained model (example code: https://github.com/ry/tensorflow-vgg16), and tf.layers.conv2d for a model trained from scratch
refer: https://stackoverflow.com/questions/42785026/tf-nn-conv2d-vs-tf-layers-conv2d