神经网络一些简单流程的理解(训练集、测试集和验证集(留出法和K折交叉验证))

其实之前学习都是很散的学习,对于训练集、验证集和测试集都没有特别的区分。这么一段时间算是在以前的基础上还是学到了一些东西(虽然都是些很简单的东西),但是我还是写写吧万一我忘了呢。哈哈哈!

训练集

其实我们在拿到训练数据的时候,我们都会把数据分成两部分,训练集也就是其中之一。顾名思义,我们需要训练集来对我们的网络权重(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折循环的基础再外套一个大循环,然后在大循环里面每次打乱一下数据。

测试集

这个就是用来模拟我们网络遇到实际数据时的情况,然后我们可以找一些评估的函数来评估我们网络的泛化能力。像是准确率呀,或者其他啥的。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值