def __call__(self, pred, labels): # pred是前面网络得到的的通用扰动和wav_data的结合, labels是说话人编号和原始音频wav_data的dict loss_dict_grad = {} loss_dict = {} pred_dict = {} label_dict = {} for key, loss in self.loss_all.items(): B = len(labels[key]) model = loss.get('model', None) if model is not None: pred_shape = pred.shape repeat = pred_shape[1]//3200 pred_this = pred.view(pred_shape[0]*repeat, pred_shape[1]//repeat) # 修改扰动与wav_data结合后的形状 label_this = torch.stack([labels[key]]*repeat, dim=1).view(B*repeat) pred_this = model(pred_this) # 把扰动后的wav_data扔到SincNet里面 else: pred_this = pred label_this = labels[key] label = labels[key] loss_func = loss["loss_func"] loss_this = loss_func(pred, label) * loss['factor'] loss_dict[key] = loss_this.detach().cpu().item() loss_dict_grad[key] = loss_this pred_dict[key] = pred_this.detach() label_dict[key] = label_this.detach() loss_list = [v for k,v in loss_dict_grad.items()] loss_total = sum(loss_list) # loss_total = loss_dict_grad['norm'] * self.loss_all['norm']['factor'] loss_dict["loss_total"] = loss_total.detach().cpu().item() return loss_total, loss_dict, loss_dict_grad, pred_dict, label_dict
时间: 2024-04-06 11:29:34 浏览: 109
这段代码是一个损失函数的计算函数,输入参数是模型的输出pred和标签labels,其中pred是前面网络得到的扰动和wav数据的结合,labels是一个包含说话人编号和原始音频wav_data的字典。该函数首先定义了一个空字典来存储不同损失函数的结果,然后遍历所有的损失函数,对每个损失函数进行计算。如果该损失函数需要把扰动后的wav数据送入一个SincNet模型中,那么就先调整pred的形状,并把扰动后的wav数据送入模型中。最后,该函数返回了总损失值loss_total,以及每个损失函数的结果和对应的pred和label。
相关问题
labels_pred = net(data_test');返回的并不是0,1标签
可能是因为你的网络输出并不是经过sigmoid函数或者softmax函数处理的概率值,而是一些其他的连续值或者离散值。如果你想要得到0/1标签,可以通过设置一个阈值,将网络输出大于阈值的视为1,小于阈值的视为0。具体的阈值可以根据你的实际情况进行调整,例如可以选择0.5作为阈值。下面是一段示例代码:
```python
import torch
# 假设你的网络输出是一个大小为(n,1)的张量net_output
threshold = 0.5 # 阈值
labels_pred = torch.zeros_like(net_output)
labels_pred[net_output > threshold] = 1
```
这样就可以得到0/1标签了。如果网络输出是多分类问题,可以使用类似的方法,只需要将阈值改为一个数组,每个元素对应一个类别的阈值即可。
def median_absolute_percentage_error(y_true,y_pred):
该函数计算真实值和预测值之间的中位绝对百分比误差(Median Absolute Percentage Error,简称MAPE)。
以下是该函数的Python代码实现:
```
import numpy as np
def median_absolute_percentage_error(y_true, y_pred):
"""
Computes median absolute percentage error between two arrays.
"""
y_true = np.array(y_true)
y_pred = np.array(y_pred)
return np.median(np.abs((y_true - y_pred) / y_true)) * 100
```
该函数首先将真实值和预测值转换为numpy数组,然后计算它们之间的绝对误差,并将其除以真实值。最后,它返回绝对误差的中位数乘以100,即中位绝对百分比误差。
阅读全文