将Beam分数转储到HDF文件



我有一个翻译模型(TM(,它使用波束搜索来综合其假设。出于分析目的,我想研究TM的ChoiceLayer发射的每个波束中的所有假设。我能够从TM的ChoiceLayer中获取每个输入序列的假设,并使用HDFDumpLayer:将其写入我的文件系统

'__SEARCH_dump_beam__': {
'class': 'hdf_dump',
'from': ['output'],
'filename': "<my-path>/beams.hdf",
'is_output_layer': True
}

但除了假设之外,我还想存储每个假设的分数。我可以使用ChoiceGetBeamScoresLayerChoiceLayer获取波束得分,但无法使用HDFDumpLayer:转储得分

'get_scores': {'class': 'choice_get_beam_scores', 'from': ['output']},
'__SEARCH_dump_scores__': {
'class': 'hdf_dump',
'from': ['get_scores'],
'filename': "<my-path>/beam_scores.hdf",
'is_output_layer': True
}

像这样运行配置,会让RETURNN抱怨ChoiceGetBeamScoresLayeroutput没有时间轴:

Exception creating layer root/'__SEARCH_dump_scores__' of class HDFDumpLayer with opts:
{'filename': '<my-path>/beam_scores.hdf',
'is_output_layer': True,
'name': '__SEARCH_dump_scores__',
'network': <TFNetwork 'root' train=False search>,
'output': Data(name='__SEARCH_dump_scores___output', shape=(), time_dim_axis=None, beam=SearchBeam(name='output/output', beam_size=12, dependency=SearchBeam(name='output/prev:output', beam_size=12)), batch_shape_meta=[B]),
'sources': [<ChoiceGetBeamScoresLayer 'get_scores' out_type=Data(shape=(), time_dim_axis=None, beam=SearchBeam(name='output/output', beam_size=12, dependency=SearchBeam(name='output/prev:output', beam_size=12)), batch_shape_meta=[B])>]}
Unhandled exception <class 'AssertionError'> in thread <_MainThread(MainThread, started 139964674299648)>, proc 31228.
...
File "<...>/returnn/repository/returnn/tf/layers/basic.py", line 6226, in __init__
line: assert self.sources[0].output.have_time_axis()
locals:
self = <local> <HDFDumpLayer '__SEARCH_dump_scores__' out_type=Data(shape=(), time_dim_axis=None, beam=SearchBeam(name='output/output', beam_size=12, dependency=SearchBeam(name='output/prev:output', beam_size=12)), batch_shape_meta=[B])>
self.sources = <local> [<ChoiceGetBeamScoresLayer 'get_scores' out_type=Data(shape=(), time_dim_axis=None, beam=SearchBeam(name='output/output', beam_size=12, dependency=SearchBeam(name='output/prev:output', beam_size=12)), batch_shape_meta=[B])>]
output = <not found>
output.have_time_axis = <not found>
AssertionError

我试图使用ExpandDimsLayerEvalLayer改变分数数据的形状,使用几种不同的配置,但这些都会导致不同的错误。我确信我不是第一个试图丢弃光束分数的人。有人能告诉我,如何正确地做到这一点吗?

回答问题:

您遇到的HDFDumpLayerassert只是因为它尚未实现(支持无时间轴转储数据(。您可以创建一个pull请求并添加对HDFDumpLayer的支持。

如果你只想以任何方式转储这些信息,而不一定是通过HDFDumpLayer,还有几个其他选项:

  • 对于task="search",作为search_output_layer,只需选择仍包括波束信息的层,即不在DecideLayer之后。这将简单地推翻所有的假设,包括他们的波束得分。

  • 使用自定义的EvalLayer并以您想要的任何方式转储它。

最新更新