神经网络训练多个epoch,写论文的时候可以取最好的效果那一个epoch作为结果吗?

论文中一般都是用在**验证集上效果最好的模型去预测测试集,多次预测的结果取平均计算准确率或者mAP值而不是单纯的取一次最好的结果作为论文的结果。**如果你在写论文的过程中,把测试集当做验证集去验证的话,这其实是作假的,建议不要这样,一旦有人举报或者复现出来你的结果和你论文中的结果相差很大的话,是会受到很大处分的。

我之前曾遇到过这种情况,我在图像分类的过程中曾经用过CutMix增强方式,CutMix其实就是将两张图片放在一起,如下图所示,这种结果会造成验证集上准确率很大的波动,可能一会儿变成99%,一会儿变成88%,那我总不能拿99%作为我论文中的结果啊,所以还是要以最终的测试集的准确率为主,因为这个才是我们需要关注的。
CutMix
如果只是单纯的取提高准确率的话可以看看文中下面的一些方式,这些方式的提升一定会比单纯取最好的模型的效果要好的。

首先我们需要理解一下概念**,什么是训练集?什么是验证集?什么是测试集?**大家很容易将“验证集”与“测试集”,“交叉验证”混淆。

首先我们来了解一下基本的概念哈,然后在分析如何解决分类问题,提高模型的准确率和泛化能力。

训练集、验证集、测试集

训练集(train set) —— 用于模型拟合的数据样本。

验证集(development set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。

测试集 —— 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。

一个形象的比喻:

**训练集:**学生的课本;学生 根据课本里的内容来掌握知识。

**验证集:**作业,通过作业可以知道 不同学生学习情况、进步的速度快慢。

**测试集:**考试,考的题是平常都没有见过,考察学生举一反三的能力。

为什么验证数据集和测试数据集两者都需要?

因为验证数据集(Validation Set)用来调整模型参数从而选择最优模型,模型本身已经同时知道了输入和输出,所以从验证数据集上得出的误差(Error)会有偏差(Bias)。

但是我们只用测试数据集(Test Set) 去评估模型的表现,并不会去调整优化模型。

传统上,一般三者切分的比例是:6:2:2,验证集并不是必须的即验证集可有可无。

2.K-折交叉验证(K-fold Cross Validation,记为K-CV)

就按照作者说的10折交叉来说,算法步骤是(图如1):

  1. 将数据集分成十份,轮流将其中9份作为训练数据,1份作为测试数据,进行试验。每次试验都会得出相应的正确率。

  2. 10次的结果的正确率的平均值作为对算法精度的估计,一般还需要进行多次10折交叉验证(例如10次10折交叉验证),再求其均值,作为对算法准确性的估计。在这里插入图片描述
    在数据缺乏的情况下使用,如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,故LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标。

优点:

(1)每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。

(2)实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。

缺点:

计算成本高,需要建立的模型数量与原始数据样本数量相同。当数据集较大时几乎不能使用。

3. 关于保存最优的模型

1. keras 保存最佳的训练模型:

from keras.callbacks import ModelCheckpoint
 
filepath='weights.best.hdf5'
    # 有一次提升, 则覆盖一次.
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1,save_best_only=True,mode='max',period=2) callbacks_list = [checkpoint]
 
model.compile(loss='categorical_crossentropy', optimizer=optimizers.Adam(lr=2e-6,decay=1e-7),metrics=['acc'])
 
history1 = model.fit_generator(
          train_generator,
          steps_per_epoch=100,
          epochs=40,
          validation_data=validation_generator,
          validation_steps=100, callbacks=callbacks_list)

注:TensorFlow2.0的写法和Keras差不多。

2. Pytroch保存最优的训练模型:

min_loss = 100000#随便设置一个比较大的数
    for epoch in range(epochs):
	    train()
	    val_loss = val()
	    if val_loss < min_loss:
	       min_loss = val_loss
	       print("save model")
	       torch.save(net.state_dict(),'model.pth')
  • 12
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
好的,训练神经网络可以使用许多深度学习框架,如TensorFlow、PyTorch、Keras等。这里我将提供一个使用PyTorch训练神经网络并记录每个epoch准确率的示例代码。 ``` import torch import torchvision import torchvision.transforms as transforms # 定义转换器 transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) # 加载训练数据集 trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True, num_workers=2) # 定义模型 class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = torch.nn.Conv2d(1, 6, 5) self.pool = torch.nn.MaxPool2d(2, 2) self.conv2 = torch.nn.Conv2d(6, 16, 5) self.fc1 = torch.nn.Linear(16 * 4 * 4, 120) self.fc2 = torch.nn.Linear(120, 84) self.fc3 = torch.nn.Linear(84, 10) def forward(self, x): x = self.pool(torch.nn.functional.relu(self.conv1(x))) x = self.pool(torch.nn.functional.relu(self.conv2(x))) x = x.view(-1, 16 * 4 * 4) x = torch.nn.functional.relu(self.fc1(x)) x = torch.nn.functional.relu(self.fc2(x)) x = self.fc3(x) return x # 定义模型、损失函数和优化器 net = Net() criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.SGD(net.parameters(), lr=0.001, momentum=0.9) # 训练模型 for epoch in range(500): running_loss = 0.0 correct = 0 total = 0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() acc = 100 * correct / total print('Epoch %d, Loss: %.3f, Accuracy: %.3f%%' % (epoch + 1, running_loss / len(trainloader), acc)) ``` 在每个epoch的循环中,我们通过计算准确率来记录模型的性能,并在每个epoch结束时打印出来。如果您想将每个epoch的准确率记录到一个文件中,可以使用Python的文件操作来实现。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值