我有一个翻译模型(TM(,它使用波束搜索来综合其假设。出于分析目的,我想研究TM的ChoiceLayer
发射的每个波束中的所有假设。我能够从TM的ChoiceLayer
中获取每个输入序列的假设,并使用HDFDumpLayer
:将其写入我的文件系统
'__SEARCH_dump_beam__': {
'class': 'hdf_dump',
'from': ['output'],
'filename': "<my-path>/beams.hdf",
'is_output_layer': True
}
但除了假设之外,我还想存储每个假设的分数。我可以使用ChoiceGetBeamScoresLayer
从ChoiceLayer
获取波束得分,但无法使用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抱怨ChoiceGetBeamScoresLayer
output
没有时间轴:
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
我试图使用ExpandDimsLayer
和EvalLayer
改变分数数据的形状,使用几种不同的配置,但这些都会导致不同的错误。我确信我不是第一个试图丢弃光束分数的人。有人能告诉我,如何正确地做到这一点吗?
回答问题:
您遇到的HDFDumpLayer
assert
只是因为它尚未实现(支持无时间轴转储数据(。您可以创建一个pull请求并添加对HDFDumpLayer
的支持。
如果你只想以任何方式转储这些信息,而不一定是通过HDFDumpLayer
,还有几个其他选项:
-
对于
task="search"
,作为search_output_layer
,只需选择仍包括波束信息的层,即不在DecideLayer
之后。这将简单地推翻所有的假设,包括他们的波束得分。 -
使用自定义的
EvalLayer
并以您想要的任何方式转储它。