首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bidirectional_dynamic_rnn中的跳过值

bidirectional_dynamic_rnn中的跳过值
EN

Stack Overflow用户
提问于 2019-03-31 21:32:10
回答 1查看 93关注 0票数 0

我希望在整个文档上使用BERT-嵌入来实现NER。一个文档由几个句子组成,每个句子都由标记组成,并有可变的长度。现在,我用BERT为每个句子创建单词嵌入,并为每个句子创建pad。然后,我想在文档的所有标记上使用双向LSTM来执行NER,而不仅仅是在句子上。

如果我这样做没有微调伯特(提取特性,如与ElMo嵌入),那么我可以只是删除填充令牌和连接所有的句子,然后我把他们的双向LSTM。

但我如何在微调环境下做到这一点呢?

我的输入有以下形状:文档、句子、标记

对于BERT I,将输入重塑为: documents *语句、记号

然后,我想将伯特的输出放入一个带有形状文档、句子*标记的bidirectional_dynamic_rnn中。不幸的是,这些句子包含填充的记号(0),bidirectional_rnn应该跳过它们。

我不能使用sequence_length参数的bidirectional_dynamic_rnn,因为填充的令牌可能在序列中。例如,一份文件由两句话组成:

代码语言:javascript
复制
   s1=[1, 2, 3, 0, 0]
   s1=[10, 20, 30, 40, 50]

如果我把句子连在一起

代码语言:javascript
复制
   s1+s2=[1, 2, 3, 0, 0, 10, 20, 30, 40, 50]

bidirectional_dynamic_rnn现在应该跳过零。

我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2019-04-03 08:13:29

我已经编写了一个小的例子来排序垫子值到列表的末尾。我不知道这个解决方案有多有效,但我希望它能有所帮助。

代码语言:javascript
复制
import tensorflow as tf

vec = tf.convert_to_tensor([[1, 2, 3, 0, 0, 10, 20, 30, 40, 50], [1, 2, 3, 4, 5, 0, 0, 0, 7, 0]])

number_mask = tf.cast(tf.not_equal(vec, 0), dtype=tf.int32)
pad_mask = 1 - number_mask
index_list = tf.cumsum(tf.ones_like(number_mask), axis=-1) - 1
fill_values = tf.reduce_max(index_list, axis=-1, keep_dims=True) + 1
content = index_list * number_mask + pad_mask * fill_values
pad = index_list * pad_mask - number_mask

content_sort = tf.sort(content, axis=1)
pad_sort = tf.sort(pad, axis=1)

content_sort_mask = tf.cast(tf.less(content_sort, fill_values), tf.int32)
pad_sort_mask = tf.cast(tf.greater(pad_sort, -1), tf.int32)

result_index = content_sort * content_sort_mask + pad_sort * pad_sort_mask

result = tf.batch_gather(vec, result_index)

with tf.Session() as sess:
    print(sess.run([result]))
    # [array([[ 1,  2,  3, 10, 20, 30, 40, 50,  0,  0],
              [ 1,  2,  3,  4,  5,  7,  0,  0,  0,  0]], dtype=int32)]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55445639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档