我正在训练一个神经网络,并想检查它的准确性。我已经使用Librosa和SciKitLearn将音频表示为1DNumpy数组。因此,x_train, x_test, y_train,
和y_test
都是一维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 = 512
train_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_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)
请注意,此代码已更新,以前有问题的行是:
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()
发布于 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
,可以对其求和以获得浮点值。
发布于 2021-10-23 04:27:54
替换
correct_train += float((predicted == label)).sum()
使用
correct_train += sum(predicted == label)
您不需要将布尔张量转换为浮点型,sum
函数非常智能,可以将False转换为0,将True转换为1
https://stackoverflow.com/questions/69683898
复制相似问题