其实之前学习都是很散的学习,对于训练集、验证集和测试集都没有特别的区分。这么一段时间算是在以前的基础上还是学到了一些东西(虽然都是些很简单的东西),但是我还是写写吧万一我忘了呢。哈哈哈!
训练集
其实我们在拿到训练数据的时候,我们都会把数据分成两部分,训练集也就是其中之一。顾名思义,我们需要训练集来对我们的网络权重(weight)和偏倚(bias)来训练,而我们所有参数的更新都是通过误差来更新的,而这个误差也就是我们定义的损失函数,常见的损失函数有均方差(回归问题)、交叉熵(分类问题)等,我们的网络通过一系列的矩阵乘法进行前向传播,在和实际值对比之后,通过损失函数得到误差。现在有了误差之后,我们就得更新权重,而更新权重的方法我们称之为:优化方法,常见的就是梯度下降等优化方式。而训练集的主要目的就是更新这些权重等参数。
验证集
其实验证集算是训练集分出来的一部分,这个是在网络训练完成之后,我们调整超参数所用的数据集。所谓超参数就是决定网络的结构和学习方式的一些参数,像是网络的学习率、优化函数、网络的层数和隐藏层的个数等。之所以不用测试集来调整参数,你可以这么理解:测试集的数据必须是未知的。为了让网络的泛化能力最大化,我们不能透露一点点测试集的数据,一旦网络在测试集上训练过之后,对于网络来说这个数据集就已经不算是未知了,也就没有办法更好的说明我们网络的泛化能力了。所以,这就是验证集的意义。常见的算法有:留出法和K折交叉验证。
留出法
# 留出法
import numpy as np
import keras
line = 10000
np.random.shuffle(data) #打乱数据
validation_data = data[:10000]
train_data = data[:]
model=get_model()
model.train(train_data)
validation_score = model.evaluate(validation_data)
#超参数调节完成之后,将训练数据和验证数据相加然后进行一次网络的总训练。
K折交叉验证
#一般就是数据量比较小的时候可能会用K折交叉验证。
k = 4 #四折
number = len(data) // k #整除K
np.random.shuffle(data)
validation_score=[]
for fold in range(k):
validation_data = data[fold*number:(fold+1)*number]
train_data = np.concatenate(data[:fold*number],data[(fold+1)*number:]) #将剩下的部分拼接在一起
model = C_model()
model.train(train_data)
validation_score = model.evaluate(train_data)
validation_scores.append(validation_score)
validation_score = np.average(validation_scores) #这一步得到了平均的loss然后进行超参数的调整。
当然还有一个方法叫做重复K折交叉验证,我个人觉得也就是在K折循环的基础再外套一个大循环,然后在大循环里面每次打乱一下数据。
测试集
这个就是用来模拟我们网络遇到实际数据时的情况,然后我们可以找一些评估的函数来评估我们网络的泛化能力。像是准确率呀,或者其他啥的。