03_人脸识别实战(深度学习)- 数据分割

如果我们只有训练数据,将模型训练出来后,是不知道这个模型的好坏的,所以一般我们不会直接把数据全部拿去做训练,而是将数据分成“训练数据集”、“测试数据集”、“验证数据集” 3部分

这次我们只将数据分割成“训练数据集”和“测试数据集”。

上一篇博客,我们将所有的数据都放在generator文件夹里面,我们需要把它们取出来,随机的分成“训练数据”和“测试数据”,代码如下:

  • 加载所有的图片
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
# 加载所有的图片,y相当于每个人的ID,赋值不太懂的,可以打开原图理解
def load_dataset(img_path):
    img_dirs = os.listdir(img_path)
    X = []
    y = []
    for img_name in img_dirs:  
        img = cv2.imread(img_path + "/" + img_name)
        X.append(img)
        row = int(img_name.split("_")[1]) #原图(olivettifaces)中第row行的
        count = int(img_name.split("_")[2].split(".")[0]) #原图(olivettifaces)中第count列的
        y.append(int(row * 2 + count / 10)) #每个数字,代表一个人脸,图中每行2个人
    X = np.array(X) #转换为Numpy,更方便操作
    y = np.array(y)
    return X,y
  • 这里是分割图片数据集的代码(重点)
# X,y 是未分割的图片
# test_ratio表示:训练数据占8份,测试数据占2份
# seed:表示随机因子,如果估计,每次随机出来的样本都一样了
def train_test_split(X,y,test_ratio = 0.2,seed=None):
    assert X.shape[0] == y.shape[0],"the size of X must be equal to the size of y"
    assert 0.0 <= test_ratio <= 1.0,"test_ration must be valid"
    if seed:
        np.random.seed(seed)
        
    shuffle_indexes = np.random.permutation(len(X))
    test_size = int(len(X) * test_ratio)
    test_indexes = shuffle_indexes[:test_size]
    train_indexes = shuffle_indexes[test_size:]

    X_train = X[train_indexes]
    y_train = y[train_indexes]
    X_test = X[test_indexes]
    y_test = y[test_indexes]
    
    return X_train,y_train,X_test,y_test
  • 现在开始调用上面的方法
X,y = load_dataset("./data/generator")
X_train,y_train,X_test,y_test = train_test_split(X,y)
print(X_train.shape,X_test.shape)
print(y_train.shape,y_test.shape)
# 输出:
#(3200, 57, 47, 3) (800, 57, 47, 3)  
#(3200,) (800,)

我们把样本分为了训练样本:3200份,测试样本:800份

交叉验证(也就是上面的操作)
  • 如果数据比较多的情况:我们就将数据分为训练集、测试集、验证集,“训练集”用来训练“模型”、“验证集”用于“选择模型”、“测试集”用于“预测模型好坏”
  • 如果数据不充分的情况:只有“训练集”和“测试集”,将样本随机分为7:3或者8:2。反复训练后,我们选择“测试误差”最小的模型。

延伸阅读

sklearn的数据分割方法
from sklearn.model_selection import train_test_split #导入测试数据和训练数据 分割器
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4,random_state=666) #按照6:4的分割,种子为666
S折交叉验证法

将训练数据拆分为S个互不相交的相同大小的子集,然后利用S-1个子集中的数据对模型进行训练,剩下的那个子集用于模型的测试。那么这种选择方法一共有S种,经过S次选择就可以覆盖所有的选择方式。经过S次模型的训练,选择其中平均测试误差最小的模型,就可以作为最终的模型了

留一交叉验证法(leave-one-out cross validation)

当样本非常少的情况下,使用"S折交叉验证法"一样,但是只留一个样本做“测试”

查全率和查准率

这个一般用于特殊情况,比如当我们查1万人中是否患有癌症的时候,癌症的患病率为一万分之1,而你的模型能够达到99.9%的准确率,其实你的模型并不好,因为我直接猜测每个人都是健康的,准确都是99.99%,比你的模型准确更高,所以,此时我们需要更好验证模型好坏的方法,就是查全率和查准率,可以看我的另外一篇博客,分类器的性能评估

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值