记录一下自己第一次实现一个图像多分类问题,这个问题是十六分类问题,刚开始准备套用kaggle中猫狗图像分类中学到的数据图像处理方法,即创建train test validation 三个文件夹,在这三个文件夹之下又包含cats和dogs,这里有一个问题,Keras用ImageDataGenerator.flow_from_directory是如何生成一个生成器,生成器输出是数据和标签?先留下。在解决这个问题时,我也想用这样的思路,但是发现图像数据太少,而且将图像分到这些文件夹下未免不有些繁琐,我用了scikit-learn中的神奇方法:train_test_split,使用这个方法只要往这个方法中传入数据数组和标签数组就可以得到很好的划分from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test=train_test_split(data,labels,test_size=0.2,random_state=0)
。而且从解决这个问题中,我还学到了另外一种神奇的方法,即使用imutils模块,from imutils import paths imagePaths=sorted(list(paths.list_images(dataset_path)))#将路径下的所有的图片名称变成一个列表
。这样可以方便我们从图像名中截取图像的标签信息label=imagePath.split(os.path.sep)[-2]
,同时用data和labels两个列表来对数据和标签进行存储,但是要记住最后转换成Numpy格式,要始终记得,传入keras模型中的数据一定是numpy数组形式的。在这个问题中,图像的标签均为类似‘ak47’这样的分类变量,我用了手写的一个函数,将分类变量转换成整数变量,class_num=16 k=0 for name in name_list: for i in range(len(labels)): if labels[i] == name: labels[i]=k k+=1 #from keras.utils import to_categorical #labels=to_categorical(labels,class_num) labels=np.array(labels,dtype='int')
,并且最后要将其转换成one-hot编码格式.还有一个学习到的点就是from keras.preprocessing.image import ImageDataGenerator
train_gen=ImageDataGenerator(rotation_range=30,width_shift_range=0.1,height_shift_range=0.1,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode=“nearest”)图像增强处理,对于少数据时,可以采用图像增强技术。这是生成了一个图像生成器,通过ImageDataGenerator.flow()方法,可以批量的生成图像增强后的图像数据以及标签数据train_gen=ImageDataGenerator(rotation_range=30,width_shift_range=0.1,height_shift_range=0.1,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode="nearest")
train_generator=train_gen.flow(X_train,y_train,batch_size=32)。而如果想要对测试集图像使用生成器,则在fit_generator中要指定validation_steps
history=model.fit_generator(train_generator,steps_per_epoch=len(X_train)//32,epochs=50,validation_data=validation_generator,
validation_steps=50)`。从这个实例中,我得到了一个教训,学习任何知识都要自己动手去做项目,不能只跟着书上敲代码,没有思考,只有实践才是真道理。但是精度仍然很低,还请大神们为我讲解一下。不胜感激。
keras实现图像多分类
最新推荐文章于 2024-07-06 22:37:37 发布