> For the complete documentation index, see [llms.txt](https://windmising.gitbook.io/nielsen-nndl/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://windmising.gitbook.io/nielsen-nndl/introduction/shi-xian-shu-zi-fen-lei-de-shen-jing-wang-luo/1.md).

# 数据集

## 数据集说明

MNIST提供两组数据，分别是training set和testing set.\
作者在这一节中没有使用testing set，并且将training set进一步分成用于训练神经网络的数据和用于验证神经网络的数据。

| 来源                 | 数量    | 名称    | 作用     |
| ------------------ | ----- | ----- | ------ |
| MNIST training set | 50000 | 训练数据集 | 训练神经网络 |
| MNIST training set | 10000 | 验证数据集 | 验证神经网络 |
| MNIST testing set  | 10000 | 测试数据集 | 本章未使用  |

[什么是验证数据集](https://windmising.gitbook.io/liu-yu-bo-play-with-machine-learning/8-1/8-6)

## 下载数据集

网上提供的直接通过tensorflow下载数据的方法，试了都是各种报错。

书上没有直接使用tensorflow的接口下载数据，而是先下载好数据的压缩包[link](https://github.com/mnielsen/neural-networks-and-deep-learning/blob/master/data/mnist.pkl.gz)。代码读取压缩包并解压出数据。

## 相关代码

gzip: 文件压缩与解压缩 pickle: 用于python特有的类型和python的数据类型间进行转换\
zip() 函数用于将可迭代的对象作为参数，将对象中对应的元素打包成一个个元组，然后返回由这些元组组成的列表。

1. 从数据集文件解压

   ```python
   f = gzip.open('mnist.pkl.gz', 'rb')
   ```
2. 读出数据

   ```python
   pickle.load(f,encoding='bytes')
   ```

   数据分为三个tuple：tuple(训练数据)、tuple(验证数据)、tuple(测试数据)\
   每个tuple又分成2个np.array：(array(样本特征inputs), array(样本标签results))\
   样本特征inputs是m个数组，每个数组代表一个样本：inputs = \[x1,x2, ..., xn]\
   每一样本xi是包含784个元素的向量：xi = \[xi1, xi2, ..., xi784]\
   向量中的每个元素都是\[0,1]的任意实数：xij in \[0,1]\
   向量特征outputs是包含m个元素的向量：outputs = \[y1,y2,...,ym]\
   向量是的每个元素是\[0,9]的整数数值：yi in \[0,9]\
   ![](http://windmissing.github.io/images_for_gitbook/Nielsen-NNDL/1.png)
3. 将数据转换为算法需要的格式\
   **训练数据**：\
   转换后的训练数据为一个list。 list中包含m个元组：\[tuple(),tuple(), ... ,tuple()]\
   每个元组中包含一个样本$$x\_i^T$$和它对应的标签$$\vec y\_i$$：$$(x\_i^T, \vec y\_i)$$\
   样本$$x\_i^T$$是指原始数据为行量，这里对它做了转置，成了一个列向量，或者说是784\*1的矩阵：

   $$
   x\_i^T =
   \begin{bmatrix}
   \[x\_{i1}] \\
   \[x\_{i2}] \\
   \cdots \\
   \[x\_{i784}]
   \end{bmatrix}
   $$

   样本标签$$\vec y\_i$$是指将yi向量化，并且也是列向量，或者说是10\*1的矩阵。例如yi=5转化为：

   $$
   \vec y\_i =
   \begin{bmatrix}
   \[0] \\
   \[0] \\
   \[0] \\
   \[0] \\
   \[0] \\
   \[1] \\
   \[0] \\
   \[0] \\
   \[0] \\
   \[0] \\
   \end{bmatrix}
   $$

   **验证数据**：\
   转换后的验证数据为一个list。 list中包含m个元组：\[tuple(),tuple(), ... ,tuple()]\
   每个元组中包含一个样本$$x\_i^T$$和它对应的标签yi：$$(x\_i^T, y\_i)$$\
   $$x\_i^T$$的格式与训练数据的$$x\_i^T$$相同。\
   yi则是仍然后原始数据的yi **测试数据**：\
   在这一章中暂时不需要使用测试数据。\
   也可以先把测试数据准备好了。 转换的目标格式和验证数据相同。
