PyTorch: 检查模型准确性时出现“TypeError: ‘bool’ object is not iterable.”错误

我在训练一个神经网络,并想检查其准确性。我使用了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,可以对其求和以获得浮点值。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注