首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PyTorch:检查模型准确性会导致"TypeError:'bool‘object is not iterable“。

PyTorch:检查模型准确性会导致"TypeError:'bool‘object is not iterable“。
EN

Stack Overflow用户
提问于 2021-10-22 23:04:53
回答 2查看 190关注 0票数 2

我正在训练一个神经网络,并想检查它的准确性。我已经使用Librosa和SciKitLearn将音频表示为1DNumpy数组。因此,x_train, x_test, y_train,y_test都是一维Numpy数组,其中x_*数组包含浮点数,y_*数组包含对应于数据类的字符串。例如:

代码语言:javascript
运行
复制
x_train = [0.235, 1.101, 3.497]
y_train = ['happy', 'angry', 'neutral'] 

我已经编写了一个字典来将这些类(字符串)表示为整数:

代码语言:javascript
运行
复制
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():

代码语言:javascript
运行
复制
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

我定义了一个训练集、测试集、批量大小,并加载了数据:

代码语言:javascript
运行
复制
train_set = MakeDataset(x_train, y_train)
test_set = MakeDataset(x_test, y_test)

batch_size = 512

train_loader = DataLoader(train_set, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_set, batch_size=batch_size, shuffle=False)

我按如下方式定义模型、训练和测试:

代码语言:javascript
运行
复制
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_pred


model = TwoLayerMLP(180, 90, 8)
optimizer = torch.optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss()

epochs = 5000

total_train = 0
correct_train = 0
for 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))
        
        # Code runs with line below commented 
        # Else returns "TypeError: 'bool' object not iterable."
        correct_train += sum(predicted == label)

请注意,此代码已更新,以前有问题的行是:

代码语言:javascript
运行
复制
correct_train += float((predicted == label)).sum()

有人能解释为什么这个布尔对象不能像预期的那样迭代吗?

已解决

请参阅下面abhiskk答案中的注释,但为了清晰和简洁,以下更改解决了问题:

代码语言:javascript
运行
复制
pred_values, pred_indices = torch.max(outputs.data,1)
total_train += float(label.size(0))
correct_train += (sum(pred_indices == label)).item()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-23 04:17:33

预测变量既包含值又包含索引,您需要先执行pred_vals, pred_inds = torch.max(outputs.data, 1),然后才能执行correct_train += (sum(pred_inds == label)).item()

此外,在求和之前不需要转换为浮点数,您可以使用:

(predicted == label).sum().item()

(predicted == label)返回一个BoolTensor,可以对其求和以获得浮点值。

票数 1
EN

Stack Overflow用户

发布于 2021-10-23 04:27:54

替换

代码语言:javascript
运行
复制
correct_train += float((predicted == label)).sum()

使用

代码语言:javascript
运行
复制
correct_train += sum(predicted == label)

您不需要将布尔张量转换为浮点型,sum函数非常智能,可以将False转换为0,将True转换为1

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69683898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档