赞
踩
这篇博客翻译了speechbrain中关于hyperpyyaml中的官方帮助文档。大部分能理解,但是关于!new和!name的翻译解释不够清楚。
!new是为了在加载yaml文件时,就创建文件中指定类的对象。比如
- import torch
- from hyperpyyaml import load_hyperpyyaml
-
- yaml_string = """
- enc_lin: !new:speechbrain.nnet.linear.Linear
- input_size: 128
- n_neurons: 256
- bias: False
- """
- loaded_yaml = load_hyperpyyaml(yaml_string)
- model = loaded_yaml["enc_lin"]
-
- x = torch.rand(([8, 200, 128]))
- y = model(x)
- print(y.shape)
- result:
- (8,200,256)

相当于在程序中创建
- model = speechbrain.nnet.linear.Linear(
- input_size=128,
- n_neurons=256,
- bias=False
- )
效果是相同的。
!name一般使用在以下两种情况下:
第一种:
与!new相反,倘若不需要在加载文件时,自动创建对象,则使用!name,比如以下情况
- yaml_string = """
- activation: !name:torch.nn.LeakyReLU
- enc: !new:speechbrain.lobes.models.CRDNN.CRDNN
- activation: !ref <activation>
- """
'运行
激活函数activation不需要在加载文件时创建,因为在模型enc中,会对这个激活函数activation类进行创建对象。
第二种:
只是对一些普通函数的使用,比如
- yaml_string="""
- compute_cost: !name:speechbrain.nnet.losses.transducer_loss
- use_torchaudio: True
- blank_index: !ref <blank_index>
- """
-
- """
- def transducer_loss(
- log_probs,
- blank_index,
- reduction="mean",
- use_torchaudio=True,
- ):
- pass
- """
-
-
- hparams = load_hyperpyyaml(yaml_string)
- log_probs = torch.rand((8, 200, 16))
-
- hparams["compute_cost"](log_probs)

transducer_loss只是由def定义的普通函数,不需要其他多余的操作,加载完毕后,直接使用即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。