|
|
|
@ -7560,14 +7560,17 @@ def similarity_focus(input, axis, indexes, name=None):
|
|
|
|
|
SimilarityFocus Operator
|
|
|
|
|
|
|
|
|
|
Generate a similarity focus mask with the same shape of input using the following method:
|
|
|
|
|
1. Extract the 4-D matrix(here the first dimension is BatchSize) corresponding
|
|
|
|
|
1. Extract the 3-D tensor(here the first dimension is BatchSize) corresponding
|
|
|
|
|
to the axis according to the indexes. For example, if axis=1 and indexes=[a],
|
|
|
|
|
it will get the matrix T=X[:, a, :, :]. In this case, if the shape of input X
|
|
|
|
|
is (BatchSize, A, B, C), the shape of matrix T is (BatchSize, B, C).
|
|
|
|
|
2. For each index, find the largest numbers in the matrix T, so that the same
|
|
|
|
|
row and same column has at most one number(obviously there will be min(B, C)
|
|
|
|
|
numbers), and mark the corresponding position of the 3-D similarity focus mask
|
|
|
|
|
as 1, otherwise as 0. Do elementwise-or for each index.
|
|
|
|
|
is (BatchSize, A, B, C), the shape of tensor T is (BatchSize, B, C).
|
|
|
|
|
2. For each index, find the largest numbers in the tensor T, so that the same
|
|
|
|
|
row and same column has at most one number(what it means is that if the
|
|
|
|
|
largest number has been found in the i-th row and the j-th column, then
|
|
|
|
|
the numbers in the i-th or j-th column will be skipped. Obviously there
|
|
|
|
|
will be min(B, C) numbers), and mark the corresponding position of the
|
|
|
|
|
3-D similarity focus mask as 1, otherwise as 0. Do elementwise-or for
|
|
|
|
|
each index.
|
|
|
|
|
3. Broadcast the 3-D similarity focus mask to the same shape of input X.
|
|
|
|
|
|
|
|
|
|
Refer to `Similarity Focus Layer <http://www.aclweb.org/anthology/N16-1108>`_
|
|
|
|
@ -7624,9 +7627,9 @@ def similarity_focus(input, axis, indexes, name=None):
|
|
|
|
|
Args:
|
|
|
|
|
input(Variable): The input tensor variable(default float). It should
|
|
|
|
|
be a 4-D tensor with shape [BatchSize, A, B, C].
|
|
|
|
|
axis(int): Indicating the dimension to be select. It can only be
|
|
|
|
|
axis(int): Indicating the dimension to be selected. It can only be
|
|
|
|
|
1, 2 or 3.
|
|
|
|
|
indexes(list): indicating the indexes of the selected dimension.
|
|
|
|
|
indexes(list): Indicating the indexes of the selected dimension.
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Variable: A tensor variable with the same shape and same type
|
|
|
|
@ -7649,7 +7652,11 @@ def similarity_focus(input, axis, indexes, name=None):
|
|
|
|
|
if len(indexes) == 0:
|
|
|
|
|
raise ValueError("indexes can not be empty.")
|
|
|
|
|
|
|
|
|
|
out = helper.create_tmp_variable(dtype=helper.input_dtype())
|
|
|
|
|
if name is None:
|
|
|
|
|
out = helper.create_variable_for_type_inference(dtype=input.dtype)
|
|
|
|
|
else:
|
|
|
|
|
out = helper.create_variable(
|
|
|
|
|
name=name, dtype=input.dtype, persistable=False)
|
|
|
|
|
helper.append_op(
|
|
|
|
|
type='similarity_focus',
|
|
|
|
|
inputs={'X': input},
|
|
|
|
|