Deep learning Pytorch中每个历元的精度
我正在努力计算Pytorch中CNN分类器训练函数中每个历元的精度 在我运行这个脚本之后,它总是打印出0、0.25或0.75,这显然是错误的。我猜问题在于get_精度函数的输入(输出和标签),因为它们不是整个历元的累积值,但不确定如何修复 理想情况下,我想打印出每个历元的训练和测试精度Deep learning Pytorch中每个历元的精度,deep-learning,neural-network,pytorch,conv-neural-network,Deep Learning,Neural Network,Pytorch,Conv Neural Network,我正在努力计算Pytorch中CNN分类器训练函数中每个历元的精度 在我运行这个脚本之后,它总是打印出0、0.25或0.75,这显然是错误的。我猜问题在于get_精度函数的输入(输出和标签),因为它们不是整个历元的累积值,但不确定如何修复 理想情况下,我想打印出每个历元的训练和测试精度 def get_accuracy(pred, actual): assert len(pred) == len(actual) total = len(actual) _, predicted =
def get_accuracy(pred, actual):
assert len(pred) == len(actual)
total = len(actual)
_, predicted = torch.max(pred.data, 1)
correct = (predicted == actual).sum().item()
return correct / total
def train_model(model):
for epoch in range(epochs):
running_loss = 0.00
for i, data in enumerate(trainloader, 0):
inputs, labels = data
inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
outputs = cnn(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item() #calculates loss of the batch in average
running_loss /= len(trainloader)
training_accuracy = get_accuracy(outputs, labels)
test_accuracy = 'todo'
print('='*10,'iteration: {0}'.format(epoch+1),'='*10,)
print('\n Loss: {0} \n Training accuracy:{1}% \n Test accuracy: {2}%'.format(running_loss, training_accuracy, test_accuracy))
print('Finished Training')
首先,你的输入和输出不会在整个历元内累加,而计算精度时只考虑火车装载机的最后一次迭代如果你想计算精度,那么你有两个选择
首先,你的输入和输出不会在整个历元内累加,而计算精度时只考虑火车装载机的最后一次迭代如果你想计算精度,那么你有两个选择
我假设您希望计算多类情况下的精度(因此您的类的形式为
[0,1,2,3,…,N]
)
您使用的是maximum
,而它应该是argmax
,例如:
def accuracy(predictions, labels):
classes = torch.argmax(predictions, dim=1)
return torch.mean((classes == labels).float())
当您返回最大概率(或非标准化概率)时,此返回索引具有最大值。由于概率几乎从不等于1
,因此您应该始终具有0精度(高达float
精度,它有时可能非常接近0
或1
,因此可能会“命中”)
例如0.9!=2
并且您永远无法预测类2
,但您可能会意外地预测类1
(0.99999999~=1
)
这个函数应该在内部循环中调用,就像计算损耗一样,因此它应该是:
for epoch in range(epochs):
running_loss = 0.00
running_accuracy = 0.00
for i, data in enumerate(trainloader, 0):
inputs, labels = data inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
outputs = cnn(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
running_accuracy += accuracy(outputs, labels)
running_loss /= len(trainloader)
running_accuracy /= len(trainloader)
测试和验证也是一样,只需将您的模型切换到评估模式(通过
model.eval()
)并使用torch.no_grad():上下文管理器禁用梯度) 我假设您希望计算多类情况下的精度(因此您的类的形式为[0,1,2,3,…,N]
)
您使用的是maximum
,而它应该是argmax
,例如:
def accuracy(predictions, labels):
classes = torch.argmax(predictions, dim=1)
return torch.mean((classes == labels).float())
当您返回最大概率(或非标准化概率)时,此返回索引具有最大值。由于概率几乎从不等于1
,因此您应该始终具有0精度(高达float
精度,它有时可能非常接近0
或1
,因此可能会“命中”)
例如0.9!=2
并且您永远无法预测类2
,但您可能会意外地预测类1
(0.99999999~=1
)
这个函数应该在内部循环中调用,就像计算损耗一样,因此它应该是:
for epoch in range(epochs):
running_loss = 0.00
running_accuracy = 0.00
for i, data in enumerate(trainloader, 0):
inputs, labels = data inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
outputs = cnn(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
running_accuracy += accuracy(outputs, labels)
running_loss /= len(trainloader)
running_accuracy /= len(trainloader)
测试和验证也是一样,只需将您的模型切换到评估模式(通过model.eval()
)并使用torch.no_grad():上下文管理器禁用梯度)