2、数据集

知识补充

今天学习第二个视频。传送门
这一个视频讲的是数据集,也就是MNIST的使用。up主说要认真阅读上面的信息。我英语能力有限,大部分是用机翻看的。下面贴上机翻出来的内容。
在这里插入图片描述
在本次视频中,up主提起来三种数据集:训练集,测试集,验证集。关于这个三种数据集可以看一下这个文章传送门,里面讲解的十分形象,容易理解。
在这里我就简单解释一下这三者之间的关系。

  • 训练集(Training Dataset):顾名思义,这个里面的数据就是用来训练模型的,形象一点说就是学生在课上学习到知识。让这个学生可以把所学的知识可以输出。
  • 测试集(Test set):对输出结果进行测试,来判断模型参数的正确性。当然用来测试的数据可以是训练集里的数据,也可以是训练集之外的数据。就像是学生考试一样,试卷上题目题型是一样,但是我换了一个数字,会不会做这道题目,就要看学生是否真正掌握了这个知识点。但是如果恰好,我的测试数据都是训练集里的数据,题目都是学生之前学过的,直接写答案就是。这样就会产生过拟合现象。过拟合是指训练误差和测试误差之间的差距太大。遇到一样的题目才会写,换了个数字就不会了。这个误差就很大了。这个时候我们就要引入另外一个数据集了—测试集。
  • 验证集(Validation Dataset):对训练集的输出结果进行一个初步验证,根据验证结果来调整参数,同时通过调整超参数,让模型处于最好的状态。就是学生课后写的练习题,对所学知识进行巩固和强化。

代码解释

接下来的内容在代码中注释出来:

#pathlib 路径操作函数库
from pathlib import Path #从pathlib函数库中,调用Path对象
dataset_path=Path('../MNIST') #在单引号里面填入MNIST所在的路径。 './'表示当前目录,'../'表示上一级目录,'/'表示根目录

#对四个目标文件的路径直接进行拼接
train_img_path=dataset_path/'train-images.idx3-ubyte'
train_lab_path=dataset_path/'train-labels.idx1-ubyte'
test_img_path=dataset_path/'t10k-images.idx3-ubyte'
test_lab_path=dataset_path/'t10k-labels.idx1-ubyte'

train_num=50000 #训练集的数量
valid_num=10000 #验证集的数量
test_num=10000 #测试集的数量

#strtuct模块主要在Python中的值与C语言结构之间的转换。可用于处理存储在文件或网络连接(或其它来源)中的二进制数据。
import struct
#with as 是python中的特殊语句。在java中打开一个文件要进行try catch并抛出异常代码写起来冗余,在python中使用 with as 语句操作上下文管理器,
#它能够帮助我们自动分配并且释放资源。
with open(train_img_path,'rb') as f:#以bite的方式read出文件  训练图
    #unpack(fmt,string) fmt:format 格式 string 字节
    struct.unpack('>4i',f.read(16))# >:大端法存放字节 4:4个一组 i:int类型,
    #把读出的数据用np中的数组表示。uint8:无符号整型,大小是一个字节。reshape是讲数组二维化,第一个参数是行数,第二个参数是列数。-1:自动确定行数
    tmp_img=np.fromfile(f,dtype=np.uint8).reshape(-1,28*28)
    train_img=tmp_img[:train_num] #冒号表示的是范围的意思,:在前表示train_num之前的数据
    valid_img=tmp_img[train_num:]#:在后表示train_num之后的数据

with open(test_img_path,'rb') as f: #测试图
    struct.unpack('>4i',f.read(16))
    test_img=np.fromfile(f,dtype=np.uint8).reshape(-1,28*28)

with open(train_lab_path,'rb') as f: #训练标签
    struct.unpack('>2i',f.read(8))
    tmp_lab=np.fromfile(f,dtype=np.uint8)
    train_lab=tmp_lab[:train_num]
    valid_lab=tmp_lab[train_num:]

with open(test_lab_path,'rb') as f: #测试标签
    struct.unpack('>2i',f.read(8))
    test_lab=np.fromfile(f,dtype=np.uint8)

import matplotlib.pyplot as plt  #将数据图形化
def show_train(index):
    plt.imshow(train_img[index].reshape(28,28),cmap='gray')#camp:颜色图谱(colormap),gray:显示黑白
    print('label : {}'.format(train_lab[index]))#将得出的lable放入lable字典中,并输出

def show_vaild(index):
    plt.imshow(valid_img[index].reshape(28,28),cmap='gray')
    print('label : {}'.format(valid_lab[index]))

def show_test(index):
    plt.imshow(test_img[index].reshape(28,28),cmap='gray')
    print('label : {}'.format(test_lab[index]))
    
#调用三个函数
show_train(np.random.randint(train_num))#randint(x)生成(0,x]的随机整数
show_vaild(np.random.randint(valid_num))
show_test(np.random.randint(test_num))

每日一句:我们的征途是星辰大海。

猜你喜欢

转载自blog.csdn.net/fayoung3568/article/details/117571917
今日推荐