我正在尝试为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
中设置的词汇量。
答案 0 :(得分:0)
因此,这种怪异的行为来自于我正在远程调试中,并且usr_dir
的源文件未正确同步的事实。一切正常,但源文件不匹配。
案例已关闭。