Tensorflow学习(使用jupyter notebook)
Keras框架下的猫狗识别(二)
Keras框架下的猫狗识别(三)
数据预处理
前言
深度学习作为一个近年兴起的重要研究领域,被应用于多个领域。在未来几年,深度学习的热度仍然会持续火热。一、tensorflow和keras的关系
TensorFlow和Keras都是深度学习所可以使用的框架。 而且Keras其实就是TensorFlow和Keras的接口(Keras作为前端,TensorFlow或theano作为后端),它也很灵活,且比较容易学。可以把keras看作为tensorflow封装后的一个API。 至今,Tensorflow是已经更新到2.0以上的版本了,相比于Tensorflow1.X的版本,就是在引入keras库和tensorflow库的时候的差别了。 举个例子: 在1.X的版本下的tensorflow中,jupyter notebook里面输入如下from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator
这是不会报错的。
但使用Tensorflow2.X的时候,以上代码就得改成如下:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Convolution2D, MaxPooling2D
from tensorflow.keras.layers import Activation, Dropout, Flatten, Dense
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import ImageDataGenerator
才能方便后续的继续操作。
二、图像预处理
为了完成后续的深度学习的猫狗识别任务,我们先得了解如何处理巨大的猫狗数据集。1.人为处理
对于如此庞大的数据集,我们并不先急的直接上代码操作,相反,我们首先要完成的是对这些图片进行分类,将这些图片分为test和train两个文件夹,再在这两个文件夹中进行cat和dog的分类,将猫归入以Cat为名的文件夹,而将狗归入Dog为名的文件夹。 需要注意的是,test中的图片不应该出现在train中,防止数据过度拟合。2.引入库
代码如下(示例):
from keras.preprocessing.image import ImageDataGenerator,array_to_img,img_to_array,load_img
首先引入我们需要的函数库,其中引入的这些库中,都是为了后续代码对图片处理进行准备。
3.对图片集的补充
代码如下(示例):
datagen = ImageDataGenerator(
rotation_range = 40, # 随机旋转角度
width_shift_range = 0.2, # 随机水平平移
height_shift_range = 0.2, # 随机竖直平移
rescale = 1./255, # 数值归一化
shear_range = 0.2, # 随机裁剪
zoom_range =0.2, # 随机放大
horizontal_flip = True, # 水平翻转
fill_mode='nearest') # 填充方式
使用引入库中的ImageDataGenerator() 方法,而对于这个ImageDataGenerator() 方法,是为了扩充数据集,但数据集图片不足时,可以使用该函数,进行同一照片不同变换。
# rotation_range是一个0~180的度数,用来指定随机选择图片的角度。
# width_shift和height_shift用来指定水平和竖直方向随机移动的程度,这是两个0~1之间的比
# rescale值将在执行其他处理前乘到整个图像上,我们的图像在RGB通道都是0~255的整数,这样的操作可能使图像的值过高或过低,所以我们将这个值定为0~1之间的数。
# shear_range是用来进行剪切变换的程度,参考剪切变换
# zoom_range用来进行随机的放大
# horizontal_flip随机的对图片进行水平翻转,这个参数适用于水平翻转不影响图片语义的时候
# fill_mode用来指定当需要进行像素填充,如旋转,水平和竖直位移时,如何填充新出现的像素
如上,是ImageDataGenerator中相关参数,可通过调节其参数,完成对一个图片的更改,以便后续扩充数据集的。
4.载入图片
img = load_img('image/train/cat/cat.1.jpg')
x = img_to_array(img)
print(x.shape)
还是使用引入库中的方法对图片进行处理,load_img()载入train文件夹中的cat类的第一张图片,该路径需要各位根据自己图片存放路径而更改。
而img_to_array()则是对img处理,使其转化为array形式。
5.数据集的扩充
对数据集的扩充方法也很简单,继续调用ImageDataGenerator库i = 0
#生成10张图片
#flow 随机生成图片
for batch in datagen.flow(x,batch_size = 1,save_to_dir = 'temp1',save_prefix = 'cat',save_format = 'jpeg'):
i += 1
if i > 9:
break
利用一个循环,循环10次,从而生成10张图片。
对于datagen.flow()函数: x是我们之前定义的图片; xbatch_size默认32,为了方便,我这里将其改成了1; 而save_to_dir是生成图片存放位置; save_prefix是为了保存提升后图片时使用的前缀, 仅当设置了save_to_dir时生效;在这里我是让该程序生成的图片都以cat为前缀命名。 save_format是图片生成后,保存的格式。