我正在訓練一個神經網路,想檢查它的準確性。我已經使用 Librosa 和 SciKitLearn 以一維 Numpy 陣列的形式表示音頻。因此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()
誰能解釋為什么這個布爾物件不能按預期迭代?
uj5u.com熱心網友回復:
您不需要在求和之前轉換為浮點數,您可以使用:
(predicted == label).sum().item()
(predicted == label)回傳 aBoolTensor可以求和以獲得浮點值。
PS:奇怪的是float((predicted == label)),在我的 pytorch 版本 1.9.1 的機器上,在包含多個元素的張量上運行上述命令時沒有為您拋出錯誤,我收到一條錯誤訊息,說浮點轉換僅在以下情況下有效張量只包含一個元素。
例如
tx = torch.ones(5)
ty = torch.ones(5)
c = float((tx == ty)).sum()
拋出錯誤
----> 1 float((tx == ty))
ValueError: only one element tensors can be converted to Python scalars
您復制粘貼到復制的代碼中也有許多錯誤,我會仔細檢查以確保復制代碼是可運行的。
uj5u.com熱心網友回復:
代替
correct_train = float((predicted == label)).sum()
和
correct_train = sum(predicted == label)
您不需要將布爾張量轉換為浮點數,該sum函式足夠智能,可以將 False 轉換為 0 并將 True 轉換為 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/334184.html
標籤:Python 机器学习 火炬 属性错误 pytorch-dataloader
