keras-02 浅谈数据集的制作和加载
引言
上一章主要讲解了如何入门keras,并实现了一个简单的神经网络搭建的全部过程。这一章开始,我们将从数据,模型,训练,可视化,保存,预测等方面细化对神经网络的理解。我们搭建神经网络,第一步就是获取数据,而根据不同的任务,数据分为不同的形式。以分类任务为例,分类任务的数据集主要包括图片和标签,每一个图片对应一个标签,因此我们在保存数据集的时候分为了以下几种方式:
- 以文件夹的形式保存图片,相同类的图片保存在同一个文件夹下,不同类的图片保存在不同的文件夹下。train,val,test不同用途也分不同的文件夹。最后实现一种目录树的形式。
- 用csv文件或txt文件描述图片和标签,csv文件中第一列保存图片路径或图片数据,第二列保存标签;txt文件类似保存。
- 以h5py直接保存数据集
接下来我们就以上几种方式先谈如何制作数据集
数据集制作
1数据集制作
1.1 以文件形式保存图片和标签
这种方式比较简单,但是工作量比较大,将不同的数据集按照不同的类别分别新建不同的文件目录进行保存。这里我以我的一个自学的小项目展示。
这里我采集了不同的台球图片,用于训练神经网络训练识别台球。我们首先根据台球的台球号新建15个新的目录,这里我们可以直接新建15个目录,也可以先新建train,val,test目录。我们选择直接新建15个目录,如图:
这样我们就做好了我们的数据集,后面我们就可以从keras中加载数据集。
1.2 用csv文件保存图片和标签
csv文件是一种类似于excel的表格型文件形式,我们可以将图片的路径放在第一列,将图片标签放在第二列。这里我们以kaggle比赛的数据集为例。
我之后也会发布有个手动制作自己csv数据集的工具,来制作该类图片数据集。
1.3 用h5py文件保存图片和标签
HDF(Hierarchical Data Format)指一种为存储和处理大容量科学数据设计的文件格式及相应库文件。HDF 最早由美国国家超级计算应用中心 NCSA 开发,目前在非盈利组织 HDF 小组维护下继续发展。当前流行的版本是 HDF5。HDF5 拥有一系列的优异特性,使其特别适合进行大量科学数据的存储和操作,如它支持非常多的数据类型,灵活,通用,跨平台,可扩展,高效的 I/O 性能,支持几乎无限量(高达 EB)的单文件存储等,详见其官方介绍。h5py也是一种数据保存的方式,这首先需要安装h5py包,在终端中输入pip install h5py
即可。
h5py非常方便易用,如果我们希望创建一个h5py文件,我们只需要使用如下函数:
class File(name, mode=None, driver=None, libver=None, userblock_size=None, **kwds)
打开或创建一个 HDF5 文件,name 为文件名字符串,mode 为打开文件的模式,driver 可以指定一种驱动方式,如需进行并行 HDF5 操作,可设置为 ‘mpio’,libver 可以指定使用的兼容版本,默认为 ‘earliest’,也可以指定为 ‘latest’,userblock_size 以字节为单位指定一个在文件开头称作 user block 的数据块,一般不需要设置。返回所打开文件的句柄。
然而我们真正使用的有效参数是mode。
model | 说明 |
---|---|
r | 只读,文件必须存在 |
r+ | 读写,文件必须存在 |
w | 创建新文件,已经存在的文件会被覆盖 |
w- / x | 创建新文件写,文件如果已经存在则出错 |
a | 打开已经存在的文件进行读写,如果不存在则创建一个新文件读写,此为默认的 mode |
因此我们可以这么写:
train_file = h5py.File(os.path.join(savefilepath,"train.hdf5"), "w")
创建了文件之后,就可以把numpy的数组写入文件,我们可以利用create_dataset函数写入数组。
create_dataset(self, name, shape=None, dtype=None, data=None, **kwds)
创建一个新的 dataset。以类似文件路径的形式指明所创建 dataset 的名字 name,shape 以一个 tuple 或 list 的形式指明创建 dataset 的 shape,用 “()” 指明标量数据的 shape,dtype 指明所创建 dataset 的数据类型,可以为 numpy dtype 或者一个表明数据类型的字符串,data 指明存储到所创建的 dataset 中的数据。如果 data 为 None,则会创建一个空的 dataset,此时 shape 和 dtype 必须设置;如果 data 不为 None,则 shape 和 dtype 可以不设置而使用 data 的 shape 和 dtype,但是如果设置的话,必须与 data 的 shape 和 dtype 兼容。
train_x=train_file.create_dataset("X_train",data=np.array(X_train))
2.数据集加载
keras提供了几种不同的函数用于从不同的数据源加载图像。keras通过封装了一个generator类进行这些方法的集成。要使用这些数据读取的方法,首先得先实例化一个迭代器。这个迭代器同时提供数据增广的作用。
#1.导入图像迭代器的包
from keras.preprocessing.image import ImageDataGenerator
#2.实例化迭代器
train_datagen = ImageDataGenerator(featurewise_center=True,
featurewise_std_normalization=True,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True,
vertical_flip=True,
validation_split=0.1,
rescale=1/255.0)
#3.使用不同的加载数据的方法
1.从图像目录中加载数据
train_generator = train_datagen.flow_from_directory(
datasetdir,
target_size=(300, 300),
batch_size=32,
subset='training',
class_mode='categorical')
2.从csv文件中加载图像
train_generator = train_datagen.flow_from_dataframe()
3.从h5py文件中加载图像
train_datagen.flow()
官方文档中对上述三种函数的参数进行了详细说明,这里推荐直接阅读英文文档。