这篇博客翻译了speechbrain中关于hyperpyyaml中的官方帮助文档。大部分能理解,但是关于!new和!name的翻译解释不够清楚。
一 、 !new
!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
!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定义的普通函数,不需要其他多余的操作,加载完毕后,直接使用即可。