inference*. More formally, name inference consists of the following
two steps:


Check names: an operator may perform automatic checks at runtime
  that check that certain dimension names must match.


Propagate names: name inference propagates names to output
  tensors.


All operations that support named tensors propagate names.



x = torch.randn(3, 3, names=('N', 'C'))
x.abs().names
   ('N', 'C')



match semantics
Two names match if they are equal (string equality) or if at least
one is "None". Nones are essentially a special "wildcard" name.
"unify(A, B)" determines which of the names "A" and "B" to propagate
to the outputs. It returns the more specific of the two names, if
they match. If the names do not match, then it errors.
Note:
In practice, when working with named tensors, one should avoid
  having unnamed dimensions because their handling can be complicated.
  It is recommended to lift all unnamed dimensions to be named