Closed ume-technology closed 3 years ago
关于 torch 排序的稳定性问题, 还有一个链接可供参考, https://discuss.pytorch.org/t/is-torch-sort-stable/20714
这里的code是直接用我之前的NCRF++改过来的https://github.com/jiesutd/NCRFpp
因为之前的NCRF++是一个通用的神经网络序列标注框架,为了提升计算速度需要并行的lstm 计算,也就使用了pack_padded_sequence 模块。而此模块要求就是需要对输入按长度进行sort。不过latticelstm 并没有用pack_padded_sequence模块,因此实际上并不需要sort, 只是直接使用之前的code这里也就没有优化修改了。
多谢您的解答, 看代码的时候我不确定这个 sort 是否是必须, 我查看数据结构发现那些数据不需要排序, 我确实把代码的 sort 的那几行代码注释掉了. 只是我有疑惑没明白为什么代码中会存在 sort, 现在清楚了, 我会查看您分享过来的链接.
On Tue, Dec 15, 2020 at 5:04 PM Jie Yang notifications@github.com wrote:
Closed #123 https://github.com/jiesutd/LatticeLSTM/issues/123.
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/jiesutd/LatticeLSTM/issues/123#event-4113440318, or unsubscribe https://github.com/notifications/unsubscribe-auth/ARTUTZ425FCLDH3JPPB7JI3SU4RAJANCNFSM4U37L4FQ .
在代码中, main.py 模块,
/code
`
def batchify_with_label(input_batch_list, gpu, volatile_flag=False): """ pass """
`
这几行代码的排序有什么意义, 尤其是 关于对 char_seq_lengths 数据的排序, 由于每个 char 的长度都是 1, 这个排序我没看明白有什么作用, 而且我做了测试, 这个排序会打乱数据都是 1 的 tensor, 这是不应该的. 我去 torch 社区提问了这个问题, 得到以下答复, 可以参考: https://discuss.pytorch.org/t/a-question-about-tensor-sort/105934 以及可以参考: https://github.com/pytorch/pytorch/issues/28871
总之就是在说 torch 的 sort() 是不稳定的, 而且代码也确实把数据都是 1 的 char_seq_lengths 进行了一个排序, 但不是完全的升序也不是完全的降序.
所以还是希望作者能答复一下我这个关于代码中的疑问, 尤其是 char_seq_recover 这个数据有什么含义.
====================================
另外, 结合数据的实际情况, 我暂时修改了代码, 因为每次只传入了 1 条 sequence 数据, 而且每个 character 的长度都是 1 , 因此我取消了排序, 取而代之的是直接写定了代码如下: char_seq_recover = torch.arange(0, len(char_seq_lengths), 1). 看起来的结果好像没什么问题, 但是我不确定这之中是否会有其它细节出现偏差. git 上的 markdown 用不好. 希望大家能看明白我的描述.
谢谢~