通过mixin模式进行的覆盖方法无法按预期运行

时间:2018-11-02 09:34:10

标签: python tensor2tensor

我正在尝试为problem引入mod / mixin。我在这里特别关注SpeechRecognitionProblem。我打算修改此问题,因此我尝试执行以下操作:

class SpeechRecognitionProblemMod(speech_recognition.SpeechRecognitionProblem):

    def hparams(self, defaults, model_hparams):
        SpeechRecognitionProblem.hparams(self, defaults, model_hparams)
        vocab_size = self.feature_encoders(model_hparams.data_dir)['targets'].vocab_size
        p = defaults
        p.vocab_size['targets'] = vocab_size

    def feature_encoders(self, data_dir): 
        # ...

因此,这并没有太大作用。它从基类中调用hparams()函数,然后更改一些值。

现在,已经存在一些现成的问题,例如里布里演讲:

@registry.register_problem()
class Librispeech(speech_recognition.SpeechRecognitionProblem):
    # ..

但是,为了应用我的修改,我正在这样做:

@registry.register_problem()
class LibrispeechMod(SpeechRecognitionProblemMod, Librispeech):
    # ..

如果我没记错的话,这应该覆盖Librispeech中的所有内容(具有相同的签名),而应调用SpeechRecognitionProblemMod的函数。

由于我能够使用此代码训练模型,所以我假设它到目前为止已经可以正常工作了。

现在出现了 my 问题:

训练后,我想序列化模型。这通常有效。但是,它与我的mod无关,我实际上知道原因:

在某个时刻,hparams()被调用。调试到这一点将显示以下内容:

self                  # {LibrispeechMod}
self.hparams          # <bound method SpeechRecognitionProblem.hparams of ..>
self.feature_encoders # <bound method SpeechRecognitionProblemMod.feature_encoders of ..>

self.hparams应该是<bound method SpeechRecognitionProblemMod.hparams of ..>!似乎由于某种原因,直接调用了hparams()中的SpeechRecognitionProblem而不是SpeechRecognitionProblemMod。但是请注意,它是feature_encoders()的正确类型!

问题是,我知道这在训练过程中有效。我看到相应地应用了超参数(hparams),仅仅是因为模型的图节点名称通过我的修改而改变了。

我需要指出一个专业。 tensor2tensor允许动态加载t2t_usr_dir,这是import_usr_dir加载的其他python模块。我也在序列化脚本中也使用了该功能:

if usr_dir:
    logging.info('Loading user dir %s' % usr_dir)
    import_usr_dir(usr_dir)

虽然我无法说出这可能导致问题的原因,但这可能是我目前唯一的罪魁祸首。

如果有人看到我没看到的东西,我很乐意在这里提示我做错了什么。


那么您遇到的错误是什么?

出于完整性考虑,这是错误的hparams()方法被调用的结果:

NotFoundError (see above for traceback): Restoring from checkpoint failed.
Key transformer/symbol_modality_256_256/softmax/weights_0 not found in checkpoint

symbol_modality_256_256是错误的。应该是symbol_modality_<vocab-size>_256,其中<vocab-size>是在SpeechRecognitionProblemMod.hparams中设置的词汇量。

1 个答案:

答案 0 :(得分:0)

因此,这种怪异的行为来自于我正在远程调试中,并且usr_dir的源文件未正确同步的事实。一切正常,但源文件不匹配。

案例已关闭。