深度学习(18)神经网络与全连接层一: 数据加载
Outline
- keras.datasets
- tf.data.Dataset.from_tensor_slices
- shuffle
- map
- batch
- repeat
- we will talk Input Pipeline later
1. 常用数据集
keras.datasets
- boston housing
- Boston housing price regression dataset.
- mnist/fashion mnist
- MNIST/Fashion-MNIST dataset.
- cifar10/100
- small images classification dataset.
- imdb
- sentiment clssification dataset.
2. MNIST数据集
(1) MNIST样本
- 图片的shape=[28, 28, 1],共有70k张图片,其中60k张作为训练集,10k张作为测试集。
(2) MNIST加载案例
(a)(x, y), (x_test, y_test) = kares.datasets.mnist.load_data()
: 自动下载,管理,解析,读取,转换这一系列的工作,最终拿到的是一个Numpy的格式,其中(x, y)为train,即训练集,x.shape=[60000, 28, 28],y.shape=[60000,]; (x_test, y_test)为test,即测试集,x_test.shape=[10000, 28, 28],y_test.shape=[10000,];
(b)x.min()=0; x.max()=255
; 注意这里的min和max都是Numpy里的API,这俩值代表了一张图片里每个像素点的灰度值在[0~255]之间; 为了方便计算,需要归一化操作,在后边的操作中需要将其除以255,来达到将其值控制在[01](或者[-11]、[-0.5~0.5],具体怎么处理要看具体应用目的)之间的目的;
(c)y[:4]
: 取前4张图片的y值,即标签值,为[5, 0, 4, 1],即代表第一章图片的label值为5; 即代表第二章图片的label值为0; 即代表第三章图片的label值为4; 即代表第四章图片的label值为1; 数据类型为unit8;
(d)y_onehot = tf.one_hot(y, depth=10)
: 将y进行onehot编码,因为共有10个数字类别,所以设置depth=10;
(e)y_onehot[:2]
: 查看前两个元素,即第一个元素的标签值为“5”,所以其onehot编码为[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,]; 第一个元素的标签值为“0”,所以其onehot编码为[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.,];
3. CIFAR10/100
(1) CIFAR10/100样本
- CIFAR10表示共有10种类型(大类,例如车、狗、鸟等等)的图片; CIFAR100表示共有100种类型(小类,例如狗分为边牧、田园犬等等)的图片; CIFAR10和CIFAR100是同一个数据集;
- 每张彩色图片的shape=[32, 32, 3];
(2) CIFAR10/100加载案例
(a)(x, y), (x_test, y_test) = kares.datasets.cifar10.load_data()
: 加载与解析CIFAR10数据集;
(x, y), (x_test, y_test) = kares.datasets.cifar100.load_data(): 加载与解析CIFAR100数据集;
(b) 输入输出
训练集输入x.shape=[50000, 32, 32, 3];
训练集输出y.shape=[50000, 1];
测试集输入x_test.shape=[10000, 32, 32, 3];
测试集输出y_test.shape=[10000, 1];
(3) tf.data.Dataset
- from_tensor_slices()
(a)db = tf.data.Dataset.from_tensor_slices(x_test)
: 利用from_tensor_slices()函数将Numpy类型的x_test转换为Dataset的实例,db就可以很方便地进行迭代操作;
(b)next(iter(db)).shape: iter(db)
为迭代器,即it = iter(db)
→
\to
→ next(it);
(c) from_tensor_slice()比“先将数据转换为Tensor类型再一个个读取的方法”要好很多;
(d)db = tf.data.Dataset.from_tensor_slices((x_test, y_test))
: 这里可以看出,Dataset可以传入两个参数,x_test即images,y_test即label;
(4) .shuffle(打散功能)
(a)db = db.shuffle(10000)
: 将[0~10000]区域内的样本随机打散,注意打散的时候x_test对应的y_test必须保持一致;
(5) .map(数据预处理功能)
(a)preprocess(x, y)
: 定义一个数据预处理的函数;
(b)db2 = db.map(preprocess)
: 定义预处理函数后,就可以使用map()函数直接调用预处理函数对数据集进行预处理;
(6) .batch
(a)db3 = db2.batch(32)
: 将数据集划分为1个batch32张图片;
(7) StpIteration
(8) .repeat()
(9) For example
参考文献:
[1] 龙良曲:《深度学习与TensorFlow2入门实战》