MNIST数据集是否含验证集?mnist_loader中pickle加载逻辑解析
问题解答
一、为什么能从数据集中获取到验证集?
原始MNIST确实只有60000条训练数据和10000条测试数据,但你使用的mnist.pkl.gz是Michael Nielsen预先处理过的版本——他把原始60000条训练数据拆分成了50000条训练集和10000条验证集,测试集则保留原始的10000条不变。这个拆分是作者提前完成并序列化到pickle文件中的,所以你加载时能直接拿到三个数据集。
二、training_data, validation_data, test_data = pickle.load(f)执行时具体发生了什么?
这条语句的执行过程可以拆解为以下几步:
- 首先
f是通过gzip.open打开的压缩文件流(原代码中会实时解压mnist.pkl.gz的字节流,无需手动提前解压); pickle.load(f)会读取流中的序列化字节数据,将其反序列化为Python对象——这里的对象是一个包含三个元素的元组,对应拆分后的训练集、验证集、测试集;- 最后通过Python的解包赋值语法,把元组里的三个数据集分别赋值给
training_data、validation_data、test_data三个变量。
补充说明:这三个数据集的结构是作者预先整理好的,比如training_data是一个包含50000个元组的列表,每个元组是(输入向量, 标签向量):输入向量是784维的numpy数组(对应28x28手写图片的像素值),标签向量是10维的one-hot数组(对应0-9的数字分类);验证集和测试集的结构类似,样本数量各为10000。
内容的提问来源于stack exchange,提问作者Phi Chetham
相关产品推荐
相关产品推荐

