diff --git a/paddle/fluid/operators/similarity_focus_op.cc b/paddle/fluid/operators/similarity_focus_op.cc index 25a023aed2bbc9cd459fca2f724148f5e29e246b..768b6903b741c58d565f5b98da3349996f9ae76a 100644 --- a/paddle/fluid/operators/similarity_focus_op.cc +++ b/paddle/fluid/operators/similarity_focus_op.cc @@ -35,14 +35,17 @@ class SimilarityFocusOpMaker : public framework::OpProtoAndCheckerMaker { 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 - 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. +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 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 `_ diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index a1ef1ca00974c1338679e8ed6eefe1263d59f1e0..be0e75161bbff10dd351c24f7a56e022f20ee036 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -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 `_ @@ -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},