搜索
首页科技周边人工智能机器学习中训练和验证指标曲线图能告诉我们什么?

在本文中将对训练和验证可能产生的情况进行总结并介绍这些图表到底能为我们提供什么样的信息。

机器学习中训练和验证指标曲线图能告诉我们什么?

让我们从一些简单的代码开始以下代码建立了一个基本的训练流程框架。

from sklearn.model_selection import train_test_split<br>from sklearn.datasets import make_classification<br>import torch<br>from torch.utils.data import Dataset, DataLoader<br>import torch.optim as torch_optim<br>import torch.nn as nn<br>import torch.nn.functional as F<br>import numpy as np<br>import matplotlib.pyplot as pltclass MyCustomDataset(Dataset):<br>def __init__(self, X, Y, scale=False):<br>self.X = torch.from_numpy(X.astype(np.float32))<br>self.y = torch.from_numpy(Y.astype(np.int64))<br><br>def __len__(self):<br>return len(self.y)<br><br>def __getitem__(self, idx):<br>return self.X[idx], self.y[idx]def get_optimizer(model, lr=0.001, wd=0.0):<br>parameters = filter(lambda p: p.requires_grad, model.parameters())<br>optim = torch_optim.Adam(parameters, lr=lr, weight_decay=wd)<br>return optimdef train_model(model, optim, train_dl, loss_func):<br># Ensure the model is in Training mode<br>model.train()<br>total = 0<br>sum_loss = 0<br>for x, y in train_dl:<br>batch = y.shape[0]<br># Train the model for this batch worth of data<br>logits = model(x)<br># Run the loss function. We will decide what this will be when we call our Training Loop<br>loss = loss_func(logits, y)<br># The next 3 lines do all the PyTorch back propagation goodness<br>optim.zero_grad()<br>loss.backward()<br>optim.step()<br># Keep a running check of our total number of samples in this epoch<br>total += batch<br># And keep a running total of our loss<br>sum_loss += batch*(loss.item())<br>return sum_loss/total<br>def train_loop(model, train_dl, valid_dl, epochs, loss_func, lr=0.1, wd=0):<br>optim = get_optimizer(model, lr=lr, wd=wd)<br>train_loss_list = []<br>val_loss_list = []<br>acc_list = []<br>for i in range(epochs): <br>loss = train_model(model, optim, train_dl, loss_func)<br># After training this epoch, keep a list of progress of <br># the loss of each epoch <br>train_loss_list.append(loss)<br>val, acc = val_loss(model, valid_dl, loss_func)<br># Likewise for the validation loss and accuracy<br>val_loss_list.append(val)<br>acc_list.append(acc)<br>print("training loss: %.5f valid loss: %.5f accuracy: %.5f" % (loss, val, acc))<br><br>return train_loss_list, val_loss_list, acc_list<br>def val_loss(model, valid_dl, loss_func):<br># Put the model into evaluation mode, not training mode<br>model.eval()<br>total = 0<br>sum_loss = 0<br>correct = 0<br>batch_count = 0<br>for x, y in valid_dl:<br>batch_count += 1<br>current_batch_size = y.shape[0]<br>logits = model(x)<br>loss = loss_func(logits, y)<br>sum_loss += current_batch_size*(loss.item())<br>total += current_batch_size<br># All of the code above is the same, in essence, to<br># Training, so see the comments there<br># Find out which of the returned predictions is the loudest<br># of them all, and that's our prediction(s)<br>preds = logits.sigmoid().argmax(1)<br># See if our predictions are right<br>correct += (preds == y).float().mean().item()<br>return sum_loss/total, correct/batch_count<br>def view_results(train_loss_list, val_loss_list, acc_list):<br>plt.rcParams["figure.figsize"] = (15, 5)<br>plt.figure()<br>epochs = np.arange(0, len(train_loss_list)) plt.subplot(1, 2, 1)<br>plt.plot(epochs-0.5, train_loss_list)<br>plt.plot(epochs, val_loss_list)<br>plt.title('model loss')<br>plt.ylabel('loss')<br>plt.xlabel('epoch')<br>plt.legend(['train', 'val', 'acc'], loc = 'upper left')<br><br>plt.subplot(1, 2, 2)<br>plt.plot(acc_list)<br>plt.title('accuracy')<br>plt.ylabel('accuracy')<br>plt.xlabel('epoch')<br>plt.legend(['train', 'val', 'acc'], loc = 'upper left')<br>plt.show()<br><br>def get_data_train_and_show(model, batch_size=128, n_samples=10000, n_classes=2, n_features=30, val_size=0.2, epochs=20, lr=0.1, wd=0, break_it=False):<br># We'll make a fictitious dataset, assuming all relevant<br># EDA / Feature Engineering has been done and this is our <br># resultant data<br>X, y = make_classification(n_samples=n_samples, n_classes=n_classes, n_features=n_features, n_informative=n_features, n_redundant=0, random_state=1972)<br><br>if break_it: # Specifically mess up the data<br>X = np.random.rand(n_samples,n_features)<br>X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=val_size, random_state=1972) train_ds = MyCustomDataset(X_train, y_train)<br>valid_ds = MyCustomDataset(X_val, y_val)<br>train_dl = DataLoader(train_ds, batch_size=batch_size, shuffle=True)<br>valid_dl = DataLoader(valid_ds, batch_size=batch_size, shuffle=True) train_loss_list, val_loss_list, acc_list = train_loop(model, train_dl, valid_dl, epochs=epochs, loss_func=F.cross_entropy, lr=lr, wd=wd)<br>view_results(train_loss_list, val_loss_list, acc_list)

以上的代码很简单,就是获取数据,训练,验证这样一个基本的流程,下面我们开始进入正题。

场景 1 - 模型似乎可以学习,但在验证或准确性方面表现不佳

无论超参数如何,模型 Train loss 都会缓慢下降,但 Val loss 不会下降,并且其 Accuracy 并不表明它正在学习任何东西。

比如在这种情况下,二进制分类的准确率徘徊在 50% 左右。

class Scenario_1_Model_1(nn.Module):<br>def __init__(self, in_features=30, out_features=2):<br>super().__init__()<br>self.lin1 = nn.Linear(in_features, out_features)<br>def forward(self, x):<br>x = self.lin1(x)<br>return x<br>get_data_train_and_show(Scenario_1_Model_1(), lr=0.001, break_it=True)

机器学习中训练和验证指标曲线图能告诉我们什么?

数据中没有足够的信息来允许‘学习’,训练数据可能没有包含足够的信息来让模型“学习”。

在这种情况下(代码中训练数据时随机数据),这意味着它无法学习任何实质内容。

数据必须有足够的信息可以从中学习。 EDA 和特征工程是关键! 模型学习可以学到的东西,而不是不是编造不存在的东西。

场景 2 — 训练、验证和准确度曲线都非常不稳

例如下面代码: lr=0.1,bs=128

class Scenario_2_Model_1(nn.Module):<br>def __init__(self, in_features=30, out_features=2):<br>super().__init__()<br>self.lin1 = nn.Linear(in_features, out_features)<br>def forward(self, x):<br>x = self.lin1(x)<br>return x<br>get_data_train_and_show(Scenario_2_Model_1(), lr=0.1)

机器学习中训练和验证指标曲线图能告诉我们什么?

“学习率太高”或“批量太小”可以尝试将学习率从 0.1 降低到 0.001,这意味着它不会“反弹”,而是会平稳地降低。

get_data_train_and_show(Scenario_1_Model_1(), lr=0.001)

机器学习中训练和验证指标曲线图能告诉我们什么?

除了降低学习率外,增加批量大小也会使其更平滑。

get_data_train_and_show(Scenario_1_Model_1(), lr=0.001, batch_size=256)

机器学习中训练和验证指标曲线图能告诉我们什么?

场景 3——训练损失接近于零,准确率看起来还不错,但验证 并没有下降,并且还上升了

class Scenario_3_Model_1(nn.Module):<br>def __init__(self, in_features=30, out_features=2):<br>super().__init__()<br>self.lin1 = nn.Linear(in_features, 50)<br>self.lin2 = nn.Linear(50, 150)<br>self.lin3 = nn.Linear(150, 50)<br>self.lin4 = nn.Linear(50, out_features)<br>def forward(self, x):<br>x = F.relu(self.lin1(x))<br>x = F.relu(self.lin2(x))<br>x = F.relu(self.lin3(x))<br>x = self.lin4(x)<br>return x<br>get_data_train_and_show(Scenario_3_Model_1(), lr=0.001)

机器学习中训练和验证指标曲线图能告诉我们什么?

这肯定是过拟合了:训练损失低和准确率高,而验证损失和训练损失越来越大,都是经典的过拟合指标。

从根本上说,你的模型学习能力太强了。 它对训练数据的记忆太好,这意味着它也不能泛化到新数据。

我们可以尝试的第一件事是降低模型的复杂性。

class Scenario_3_Model_2(nn.Module):<br>def __init__(self, in_features=30, out_features=2):<br>super().__init__()<br>self.lin1 = nn.Linear(in_features, 50)<br>self.lin2 = nn.Linear(50, out_features)<br>def forward(self, x):<br>x = F.relu(self.lin1(x))<br>x = self.lin2(x)<br>return x<br>get_data_train_and_show(Scenario_3_Model_2(), lr=0.001)

机器学习中训练和验证指标曲线图能告诉我们什么?

这让它变得更好了,还可以引入 L2 权重衰减正则化,让它再次变得更好(适用于较浅的模型)。

get_data_train_and_show(Scenario_3_Model_2(), lr=0.001, wd=0.02)

机器学习中训练和验证指标曲线图能告诉我们什么?

如果我们想保持模型的深度和大小,可以尝试使用 dropout(适用于更深的模型)。

class Scenario_3_Model_3(nn.Module):<br>def __init__(self, in_features=30, out_features=2):<br>super().__init__()<br>self.lin1 = nn.Linear(in_features, 50)<br>self.lin2 = nn.Linear(50, 150)<br>self.lin3 = nn.Linear(150, 50)<br>self.lin4 = nn.Linear(50, out_features)<br>self.drops = nn.Dropout(0.4)<br>def forward(self, x):<br>x = F.relu(self.lin1(x))<br>x = self.drops(x)<br>x = F.relu(self.lin2(x))<br>x = self.drops(x)<br>x = F.relu(self.lin3(x))<br>x = self.drops(x)<br>x = self.lin4(x)<br>return x<br>get_data_train_and_show(Scenario_3_Model_3(), lr=0.001)

机器学习中训练和验证指标曲线图能告诉我们什么?

场景 4 - 训练和验证表现良好,但准确度没有提高

lr = 0.001,bs = 128(默认,分类类别= 5

class Scenario_4_Model_1(nn.Module):<br>def __init__(self, in_features=30, out_features=2):<br>super().__init__()<br>self.lin1 = nn.Linear(in_features, 2)<br>self.lin2 = nn.Linear(2, out_features)<br>def forward(self, x):<br>x = F.relu(self.lin1(x))<br>x = self.lin2(x)<br>return x<br>get_data_train_and_show(Scenario_4_Model_1(out_features=5), lr=0.001, n_classes=5)

机器学习中训练和验证指标曲线图能告诉我们什么?

没有足够的学习能力:模型中的其中一层的参数少于模型可能输出中的类。 在这种情况下,当有 5 个可能的输出类时,中间的参数只有 2 个。

这意味着模型会丢失信息,因为它不得不通过一个较小的层来填充它,因此一旦层的参数再次扩大,就很难恢复这些信息。

所以需要记录层的参数永远不要小于模型的输出大小。

class Scenario_4_Model_2(nn.Module):<br>def __init__(self, in_features=30, out_features=2):<br>super().__init__()<br>self.lin1 = nn.Linear(in_features, 50)<br>self.lin2 = nn.Linear(50, out_features)<br>def forward(self, x):<br>x = F.relu(self.lin1(x))<br>x = self.lin2(x)<br>return x<br>get_data_train_and_show(Scenario_4_Model_2(out_features=5), lr=0.001, n_classes=5)

机器学习中训练和验证指标曲线图能告诉我们什么?

总结

以上就是一些常见的训练、验证时的曲线的示例,希望你在遇到相同情况时可以快速定位并且改进。


以上是机器学习中训练和验证指标曲线图能告诉我们什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:51CTO.COM。如有侵权,请联系admin@php.cn删除
Gemma范围:Google&#039;用于凝视AI的显微镜Gemma范围:Google&#039;用于凝视AI的显微镜Apr 17, 2025 am 11:55 AM

使用Gemma范围探索语言模型的内部工作 了解AI语言模型的复杂性是一个重大挑战。 Google发布的Gemma Scope是一种综合工具包,为研究人员提供了一种强大的探索方式

谁是商业智能分析师以及如何成为一位?谁是商业智能分析师以及如何成为一位?Apr 17, 2025 am 11:44 AM

解锁业务成功:成为商业智能分析师的指南 想象一下,将原始数据转换为驱动组织增长的可行见解。 这是商业智能(BI)分析师的力量 - 在GU中的关键作用

如何在SQL中添加列? - 分析Vidhya如何在SQL中添加列? - 分析VidhyaApr 17, 2025 am 11:43 AM

SQL的Alter表语句:动态地将列添加到数据库 在数据管理中,SQL的适应性至关重要。 需要即时调整数据库结构吗? Alter表语句是您的解决方案。本指南的详细信息添加了Colu

业务分析师与数据分析师业务分析师与数据分析师Apr 17, 2025 am 11:38 AM

介绍 想象一个繁华的办公室,两名专业人员在一个关键项目中合作。 业务分析师专注于公司的目标,确定改进领域,并确保与市场趋势保持战略一致。 simu

什么是Excel中的Count和Counta? - 分析Vidhya什么是Excel中的Count和Counta? - 分析VidhyaApr 17, 2025 am 11:34 AM

Excel 数据计数与分析:COUNT 和 COUNTA 函数详解 精确的数据计数和分析在 Excel 中至关重要,尤其是在处理大型数据集时。Excel 提供了多种函数来实现此目的,其中 COUNT 和 COUNTA 函数是用于在不同条件下统计单元格数量的关键工具。虽然这两个函数都用于计数单元格,但它们的设计目标却针对不同的数据类型。让我们深入了解 COUNT 和 COUNTA 函数的具体细节,突出它们独特的特性和区别,并学习如何在数据分析中应用它们。 要点概述 理解 COUNT 和 COU

Chrome在这里与AI:每天都有新事物!Chrome在这里与AI:每天都有新事物!Apr 17, 2025 am 11:29 AM

Google Chrome的AI Revolution:个性化和高效的浏览体验 人工智能(AI)正在迅速改变我们的日常生活,而Google Chrome正在领导网络浏览领域的负责人。 本文探讨了兴奋

AI的人类方面:福祉和四人底线AI的人类方面:福祉和四人底线Apr 17, 2025 am 11:28 AM

重新构想影响:四倍的底线 长期以来,对话一直以狭义的AI影响来控制,主要集中在利润的最低点上。但是,更全面的方法认识到BU的相互联系

您应该知道的5个改变游戏规则的量子计算用例您应该知道的5个改变游戏规则的量子计算用例Apr 17, 2025 am 11:24 AM

事情正稳步发展。投资投入量子服务提供商和初创企业表明,行业了解其意义。而且,越来越多的现实用例正在出现以证明其价值超出

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境