Skip to content

Commit 6b795d4

Browse files
author
Yibing Liu
authored
Merge pull request #13901 from kuke/seq_slice_py
Add py api for sequence_slice_op
2 parents fa2ab33 + 6a627ce commit 6b795d4

File tree

4 files changed

+87
-2
lines changed

4 files changed

+87
-2
lines changed

paddle/fluid/API.spec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ paddle.fluid.layers.reduce_min ArgSpec(args=['input', 'dim', 'keep_dim', 'name']
8585
paddle.fluid.layers.reduce_prod ArgSpec(args=['input', 'dim', 'keep_dim', 'name'], varargs=None, keywords=None, defaults=(None, False, None))
8686
paddle.fluid.layers.sequence_first_step ArgSpec(args=['input'], varargs=None, keywords=None, defaults=None)
8787
paddle.fluid.layers.sequence_last_step ArgSpec(args=['input'], varargs=None, keywords=None, defaults=None)
88+
paddle.fluid.layers.sequence_slice ArgSpec(args=['input', 'offset', 'length', 'name'], varargs=None, keywords=None, defaults=(None,))
8889
paddle.fluid.layers.dropout ArgSpec(args=['x', 'dropout_prob', 'is_test', 'seed', 'name'], varargs=None, keywords=None, defaults=(False, None, None))
8990
paddle.fluid.layers.split ArgSpec(args=['input', 'num_or_sections', 'dim', 'name'], varargs=None, keywords=None, defaults=(-1, None))
9091
paddle.fluid.layers.ctc_greedy_decoder ArgSpec(args=['input', 'blank', 'name'], varargs=None, keywords=None, defaults=(None,))

paddle/fluid/platform/profiler.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,8 @@ void ParseEvents(const std::vector<std::vector<Event>>& events,
370370
std::vector<std::vector<Event>> merged_events_list;
371371
if (merge_thread) {
372372
std::vector<Event> merged_events;
373-
for (int i = 0; i < events.size(); ++i) {
374-
for (int j = 0; j < events[i].size(); ++j) {
373+
for (size_t i = 0; i < events.size(); ++i) {
374+
for (size_t j = 0; j < events[i].size(); ++j) {
375375
merged_events.push_back(events[i][j]);
376376
}
377377
}

python/paddle/fluid/layers/nn.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
'reduce_prod',
6666
'sequence_first_step',
6767
'sequence_last_step',
68+
'sequence_slice',
6869
'dropout',
6970
'split',
7071
'ctc_greedy_decoder',
@@ -1903,6 +1904,76 @@ def sequence_last_step(input):
19031904
return sequence_pool(input=input, pool_type="last")
19041905

19051906

1907+
def sequence_slice(input, offset, length, name=None):
1908+
"""
1909+
**Sequence Slice Layer**
1910+
1911+
The layer crops a subsequence from given sequence with given start
1912+
offset and subsequence length.
1913+
1914+
It only supports sequence data (LoDTensor with lod_level equal to 1).
1915+
1916+
.. code-block:: text
1917+
1918+
- Case:
1919+
1920+
Given the input Variable **input**:
1921+
1922+
input.data = [[a1, a2], [b1, b2], [c1, c2], [d1, d2], [e1, e2]],
1923+
input.lod = [[3, 2]],
1924+
input.dims = (5, 2),
1925+
1926+
with offset.data = [[0], [1]] and length.data = [[2], [1]],
1927+
1928+
the output Variable will be
1929+
1930+
out.data = [[a1, a2], [b1, b2], [e1, e2]],
1931+
out.lod = [[2, 1]],
1932+
out.dims = (3, 2).
1933+
1934+
NOTE: The first dimension size of **input**, **offset** and **length**
1935+
should be equal. The **offset** should start from 0.
1936+
1937+
Args:
1938+
input(Variable): The input Variable which consists of the complete
1939+
sequences.
1940+
offset(Variable): The offset to slice each sequence.
1941+
length(Variable): The length of each subsequence.
1942+
name(str|None): A name for this layer(optional). If set None, the
1943+
layer will be named automatically.
1944+
1945+
Returns:
1946+
Variable: The output subsequences.
1947+
1948+
Examples:
1949+
1950+
.. code-block:: python
1951+
1952+
import numpy as np
1953+
seqs = fluid.layers.data(name='x', shape=[10, 5],
1954+
dtype='float32', lod_level=1)
1955+
offset = fluid.layers.assign(input=np.array([[0, 1]]).astype("int32"))
1956+
length = fluid.layers.assign(input=np.array([[2, 1]]).astype("int32"))
1957+
subseqs = fluid.layers.sequence_slice(input=seqs, offset=offset,
1958+
length=length)
1959+
"""
1960+
helper = LayerHelper("sequence_slice", **locals())
1961+
dtype = helper.input_dtype()
1962+
out = helper.create_tmp_variable(dtype)
1963+
1964+
offset.stop_gradient = True
1965+
length.stop_gradient = True
1966+
1967+
helper.append_op(
1968+
type="sequence_slice",
1969+
inputs={"X": input,
1970+
"Offset": offset,
1971+
"Length": length},
1972+
outputs={"Out": out})
1973+
1974+
return out
1975+
1976+
19061977
@templatedoc()
19071978
def pool2d(input,
19081979
pool_size=-1,

python/paddle/fluid/tests/unittests/test_layers.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,19 @@ def test_sequence_scatter(self):
414414
self.assertIsNotNone(out)
415415
print(str(program))
416416

417+
def test_sequence_slice(self):
418+
program = Program()
419+
with program_guard(program):
420+
import numpy as np
421+
seqs = layers.data(
422+
name='x', shape=[10, 5], dtype='float32', lod_level=1)
423+
offset = layers.assign(input=np.array([[0, 1]]).astype('int32'))
424+
length = layers.assign(input=np.array([[2, 1]]).astype('int32'))
425+
out = layers.sequence_slice(
426+
input=seqs, offset=offset, length=length)
427+
self.assertIsNotNone(out)
428+
print(str(program))
429+
417430
def test_lod_reset(self):
418431
program = Program()
419432
with program_guard(program):

0 commit comments

Comments
 (0)