TF 2.0 is out! Get hands-on practice at TF World, Oct 28-31. Use code TF20 for 20% off select passes. Register now

tfg.geometry.convolution.graph_convolution.feature_steered_convolution

Implements the Feature Steered graph convolution.

tfg.geometry.convolution.graph_convolution.feature_steered_convolution(
    data,
    neighbors,
    sizes,
    var_u,
    var_v,
    var_c,
    var_w,
    var_b,
    name=None
)

Defined in geometry/convolution/graph_convolution.py.

FeaStNet: Feature-Steered Graph Convolutions for 3D Shape Analysis Nitika Verma, Edmond Boyer, Jakob Verbeek CVPR 2018 https://arxiv.org/abs/1706.05206

The shorthands used below are V: The number of vertices. C: The number of channels in the input data. D: The number of channels in the output after convolution. W: The number of weight matrices used in the convolution. The input variables (var_u, var_v, var_c, var_w, var_b) correspond to the variables with the same names in the paper cited above.

Note:

In the following, A1 to An are optional batch dimensions.

Args:

  • data: A float tensor with shape [A1, ..., An, V, C].
  • neighbors: A SparseTensor with the same type as data and with shape [A1, ..., An, V, V] representing vertex neighborhoods. The neighborhood of a vertex defines the support region for convolution. For a mesh, a common choice for the neighborhood of vertex i would be the vertices in the K-ring of i (including i itself). Each vertex must have at least one neighbor. For a faithful implementation of the FeaStNet convolution, neighbors should be a row-normalized weight matrix corresponding to the graph adjacency matrix with self-edges: neighbors[A1, ..., An, i, j] > 0 if vertex j is a neighbor of i, and neighbors[A1, ..., An, i, i] > 0 for all i, and sum(neighbors, axis=-1)[A1, ..., An, i] == 1.0 for all i. These requirements are relaxed in this implementation.
  • sizes: An int tensor of shape [A1, ..., An] indicating the true input sizes in case of padding (sizes=None indicates no padding).Note that sizes[A1, ..., An] <= V. If data and neighbors are 2-D, sizes will be ignored. An example usage of sizes: consider an input consisting of three graphs G0, G1, and G2 with V0, V1, and V2 vertices respectively. The padded input would have the following shapes: data.shape = [3, V, C] and neighbors.shape = [3, V, V], where V = max([V0, V1, V2]). The true sizes of each graph will be specified by sizes=[V0, V1, V2] data[i, :Vi, :] and neighbors[i, :Vi, :Vi] will be the vertex and neighborhood data of graph Gi. The SparseTensor neighbors should have no nonzero entries in the padded regions.
  • var_u: A 2-D tensor with shape [C, W].
  • var_v: A 2-D tensor with shape [C, W].
  • var_c: A 1-D tensor with shape [W].
  • var_w: A 3-D tensor with shape [W, C, D].
  • var_b: A 1-D tensor with shape [D].
  • name: A name for this op. Defaults to graph_convolution_feature_steered_convolution.

Returns:

Tensor with shape [A1, ..., An, V, D].

Raises:

  • TypeError: if the input types are invalid.
  • ValueError: if the input dimensions are invalid.