我在训练一个神经网络,并想检查其准确性。我使用了Librosa和SciKitLearn将音频表示为1D Numpy数组。因此,x_train, x_test, y_train,
和y_test
都是1D Numpy数组,其中x_*数组包含浮点数,y_*数组包含对应数据类的字符串。例如:
x_train = [0.235, 1.101, 3.497]y_train = ['happy', 'angry', 'neutral']
我编写了一个字典来将这些类(字符串)表示为整数:
emotions = {'01' : 'neutral','02' : 'calm','03' : 'happy','04' : 'sad','05' : 'angry','06' : 'fearful','07' : 'disgust','08' : 'surprised'}emotion_list = list(emotions.values())
接下来,我定义了一个类来转换这些数据,使其可以传递给torch.utils.data.DataLoader():
class MakeDataset(Dataset): def __init__(self, x_train, y_train): self.x_train = torch.FloatTensor(x_train) self.y_train = torch.FloatTensor([emotion_list.index(each) for each in y_train]) def __len__(self): return self.x_train.shape[0] def __getitem__(self, ind): x = self.x_train[ind] y = emotion_list.index(y_train[ind]) return x, y
我定义了训练集、测试集、批次大小,并加载数据:
train_set = MakeDataset(x_train, y_train)test_set = MakeDataset(x_test, y_test)batch_size = 512train_loader = DataLoader(train_set, batch_size=batch_size, shuffle=True)test_loader = DataLoader(test_set, batch_size=batch_size, shuffle=False)
我定义模型、训练和测试如下:
class TwoLayerMLP(torch.nn.Module): def __init__(self, D_in, H, D_out): super(TwoLayerMLP, self).__init__() self.linear1 = torch.nn.Linear(D_in, H) self.linear2 = torch.nn.Linear(H, D_out) def forward(self, x): h_relu = self.linear1(x).clamp(min=0) y_pred = self.linear2(h_relu) return y_predmodel = TwoLayerMLP(180, 90, 8)optimizer = torch.optim.Adam(model.parameters())criterion = nn.CrossEntropyLoss()epochs = 5000total_train = 0correct_train = 0for epoch in range(epochs): model.train() running_loss = 0.0 for batch_num, data in enumerate(train_loader): audio , label = data optimizer.zero_grad() outputs = model(audio.float()) loss = criterion(outputs, label) loss.backward() optimizer.step() predicted = torch.max(outputs.data,1) total_train += float(label.size(0)) # 代码在下面这行注释时可以运行 # 否则会返回“TypeError: 'bool' object not iterable.” correct_train += sum(predicted == label)
请注意,这段代码已经更新,之前的问题行是:
correct_train += float((predicted == label)).sum()
谁能解释为什么这个布尔对象不能按预期进行迭代?
已解决
请查看下方abhiskk的回答中的评论,但为了清晰和简洁,以下更改解决了问题:
pred_values, pred_indices = torch.max(outputs.data,1)total_train += float(label.size(0))correct_train += (sum(pred_indices == label)).item()
回答:
预测变量包含值和索引,你需要执行pred_vals, pred_inds = torch.max(outputs.data, 1)
,然后你可以执行correct_train += (sum(pred_inds == label)).item()
此外,你不需要在求和前转换为浮点数,你可以使用:
(predicted == label).sum().item()
(predicted == label)
返回一个BoolTensor
,可以对其求和以获得浮点值。