Вопрос 1:
В методе front(self, x) класса SpecAugment есть свойство с именем self._forward, которое, похоже, ведет себя как функция. Однако он также получает переменную «x», как если бы это была функция. Как работает это взаимодействие?
Вопрос 2:
После передачи значения «x» свойству self._forward код выбирает политику из словаря «policies» на основе по параметру «политика». Если предположить, что я правильно понял ответ на первый вопрос, похоже, что значение «x», предоставленное self._forward, затем используется для выбора одного из «self.policy1», «self.policy2» или «self.policy3». Как работает этот процесс выбора и как эти политики выполняются без явного принятия каких-либо значений?
Ниже приведен исходный код для справки:
class SpecAugment(nn.Module):
def __init__(self,rate,policy=3,freq_mask=2,time_mask=4):
super(SpecAugment, self).__init__()
self.rate = rate
self.specaug1 = nn.Sequential(
torchaudio.transforms.FrequencyMasking(freq_mask_param=freq_mask),
torchaudio.transforms.TimeMasking(time_mask_param=time_mask)
)
self.specaug2 = nn.Sequential(
torchaudio.transforms.FrequencyMasking(freq_mask_param=freq_mask),
torchaudio.transforms.TimeMasking(time_mask_param=time_mask),
torchaudio.transforms.FrequencyMasking(freq_mask_param=freq_mask),
torchaudio.transforms.TimeMasking(time_mask_param=time_mask)
)
policies = {1:self.policy1, 2:self.policy2, 3:self.policy3}
self._forward = policies[policy]
def forward(self,x):
return self._forward(x)
#this makes specaug1
def policy1(self,x):
probability = torch.rand(1,1).item()
if self.rate > probability:
return self.specaug1(x)
return x
#this makes specaug2
def policy2(self,x):
probability = torch.rand(1,1).item()
if self.rate > probability:
return self.specaug2(x)
return x
#this makes random choice because we did torch.rand
def policy3(self,x):
probability = torch.rand(1,1).item()
if probability > 0.5:
return self.policy1(x)
return self.policy2(x)
Подробнее здесь: https://stackoverflow.com/questions/706 ... ment-class