keras分类之二分类实例(Cat and dog)
1.数据准备
在文件夹下分别建立训练目录train,验证目录validation,测试目录test,每个目录下建立dogs和cats两个目录,在dogs和cats目录下分别放入拍摄的狗和猫的图片,图片的大小可以不一样。
2.数据读取
#存储数据集的目录 base_dir='E:/pythonlearn/dog_and_cat/data/' #训练、验证数据集的目录 train_dir=os.path.join(base_dir,'train') validation_dir=os.path.join(base_dir,'validation') test_dir=os.path.join(base_dir,'test') #猫训练图片所在目录 train_cats_dir=os.path.join(train_dir,'cats') #狗训练图片所在目录 train_dogs_dir=os.path.join(train_dir,'dogs') #猫验证图片所在目录 validation_cats_dir=os.path.join(validation_dir,'cats') #狗验证数据集所在目录 validation_dogs_dir=os.path.join(validation_dir,'dogs') print('totaltrainingcatimages:',len(os.listdir(train_cats_dir))) print('totaltrainingdogimages:',len(os.listdir(train_dogs_dir))) print('totalvalidationcatimages:',len(os.listdir(validation_cats_dir))) print('totalvalidationdogimages:',len(os.listdir(validation_dogs_dir)))
3.模型建立
#搭建模型 model=Sequential() model.add(Conv2D(32,(3,3),activation='relu', input_shape=(150,150,3))) model.add(MaxPooling2D((2,2))) model.add(Conv2D(64,(3,3),activation='relu')) model.add(MaxPooling2D((2,2))) model.add(Conv2D(128,(3,3),activation='relu')) model.add(MaxPooling2D((2,2))) model.add(Conv2D(128,(3,3),activation='relu')) model.add(MaxPooling2D((2,2))) model.add(Flatten()) model.add(Dense(512,activation='relu')) model.add(Dense(1,activation='sigmoid')) print(model.summary()) model.compile(loss='binary_crossentropy', optimizer=RMSprop(lr=1e-4), metrics=['acc'])
4.模型训练
train_datagen=ImageDataGenerator(rescale=1./255) test_datagen=ImageDataGenerator(rescale=1./255) train_generator=train_datagen.flow_from_directory( train_dir,#targetdirectory target_size=(150,150),#resize图片 batch_size=20, class_mode='binary' ) validation_generator=test_datagen.flow_from_directory( validation_dir, target_size=(150,150), batch_size=20, class_mode='binary' ) fordata_batch,labels_batchintrain_generator: print('databatchshape:',data_batch.shape) print('labelsbatchshape:',labels_batch.shape) break hist=model.fit_generator( train_generator, steps_per_epoch=100, epochs=10, validation_data=validation_generator, validation_steps=50 ) model.save('cats_and_dogs_small_1.h5')
5.模型评估
acc=hist.history['acc'] val_acc=hist.history['val_acc'] loss=hist.history['loss'] val_loss=hist.history['val_loss'] epochs=range(len(acc)) plt.plot(epochs,acc,'bo',label='Trainingacc') plt.plot(epochs,val_acc,'b',label='Validationacc') plt.title('Trainingandvalidationaccuracy') plt.legend() plt.figure() plt.figure() plt.plot(epochs,loss,'bo',label='Trainingloss') plt.plot(epochs,val_loss,'b',label='Validationloss') plt.legend() plt.show()
6.预测
imagename='E:/pythonlearn/dog_and_cat/data/validation/dogs/dog.2026.jpg' test_image=image.load_img(imagename,target_size=(150,150)) test_image=image.img_to_array(test_image) test_image=np.expand_dims(test_image,axis=0) result=model.predict(test_image) ifresult[0][0]==1: prediction='dog' else: prediction='cat' print(prediction)
代码在spyder下运行正常,一般情况下,可以将文件分为两个部分,一部分为Train.py,包含深度学习模型建立、训练和模型的存储,另一部分Predict.py,包含模型的读取,评价和预测
补充知识:keras猫狗大战自搭网络以及vgg16应用
导入模块
importos importnumpyasnp importtensorflowastf importrandom importseabornassns importmatplotlib.pyplotasplt importkeras fromkeras.modelsimportSequential,Model fromkeras.layersimportDense,Dropout,Activation,Flatten,Input,BatchNormalization fromkeras.layers.convolutionalimportConv2D,MaxPooling2D fromkeras.optimizersimportRMSprop,Adam,SGD fromkeras.preprocessingimportimage fromkeras.preprocessing.imageimportImageDataGenerator fromkeras.applications.vgg16importVGG16,preprocess_input fromsklearn.model_selectionimporttrain_test_split
加载数据集
defread_and_process_image(data_dir,width=64,height=64,channels=3,preprocess=False): train_images=[data_dir+iforiinos.listdir(data_dir)] random.shuffle(train_images) defread_image(file_path,preprocess): img=image.load_img(file_path,target_size=(height,width)) x=image.img_to_array(img) x=np.expand_dims(x,axis=0) #ifpreprocess: #x=preprocess_input(x) returnx defprep_data(images,proprocess): count=len(images) data=np.ndarray((count,height,width,channels),dtype=np.float32) fori,image_fileinenumerate(images): image=read_image(image_file,preprocess) data[i]=image returndata defread_labels(file_path): labels=[] foriinfile_path: label=1if'dog'inielse0 labels.append(label) returnlabels X=prep_data(train_images,preprocess) labels=read_labels(train_images) assertX.shape[0]==len(labels) print("Trainshape:{}".format(X.shape)) returnX,labels
读取数据集
#读取图片 WIDTH=150 HEIGHT=150 CHANNELS=3 X,y=read_and_process_image('D:\\Python_Project\\train\\',width=WIDTH,height=HEIGHT,channels=CHANNELS)
查看数据集信息
#统计y sns.countplot(y) #显示图片 defshow_cats_and_dogs(X,idx): plt.figure(figsize=(10,5),frameon=True) img=X[idx,:,:,::-1] img=img/255 plt.imshow(img) plt.show() foridxinrange(0,3): show_cats_and_dogs(X,idx) train_X=X[0:17500,:,:,:] train_y=y[0:17500] test_X=X[17500:25000,:,:,:] test_y=y[17500:25000] train_X.shape test_X.shape
自定义神经网络层数
input_layer=Input((WIDTH,HEIGHT,CHANNELS)) #第一层 z=input_layer z=Conv2D(64,(3,3))(z) z=BatchNormalization()(z) z=Activation('relu')(z) z=MaxPooling2D(pool_size=(2,2))(z) z=Conv2D(64,(3,3))(z) z=BatchNormalization()(z) z=Activation('relu')(z) z=MaxPooling2D(pool_size=(2,2))(z) z=Conv2D(128,(3,3))(z) z=BatchNormalization()(z) z=Activation('relu')(z) z=MaxPooling2D(pool_size=(2,2))(z) z=Conv2D(128,(3,3))(z) z=BatchNormalization()(z) z=Activation('relu')(z) z=MaxPooling2D(pool_size=(2,2))(z) z=Flatten()(z) z=Dense(64)(z) z=BatchNormalization()(z) z=Activation('relu')(z) z=Dropout(0.5)(z) z=Dense(1)(z) z=Activation('sigmoid')(z) model=Model(input_layer,z) model.compile( optimizer=keras.optimizers.RMSprop(), loss=keras.losses.binary_crossentropy, metrics=[keras.metrics.binary_accuracy] ) model.summary()
训练模型
history=model.fit(train_X,train_y,validation_data=(test_X,test_y),epochs=10,batch_size=128,verbose=True) score=model.evaluate(test_X,test_y,verbose=0) print("LargeCNNError:%.2f%%"%(100-score[1]*100))
复用vgg16模型
defvgg16_model(input_shape=(HEIGHT,WIDTH,CHANNELS)): vgg16=VGG16(include_top=False,weights='imagenet',input_shape=input_shape) forlayerinvgg16.layers: layer.trainable=False last=vgg16.output #后面加入自己的模型 x=Flatten()(last) x=Dense(256,activation='relu')(x) x=Dropout(0.5)(x) x=Dense(256,activation='relu')(x) x=Dropout(0.5)(x) x=Dense(1,activation='sigmoid')(x) model=Model(inputs=vgg16.input,outputs=x) returnmodel
编译模型
model_vgg16=vgg16_model() model_vgg16.summary() model_vgg16.compile(loss='binary_crossentropy',optimizer=Adam(0.0001),metrics=['accuracy'])
训练模型
#训练模型 history=model_vgg16.fit(train_X,train_y,validation_data=(test_X,test_y),epochs=5,batch_size=128,verbose=True) score=model_vgg16.evaluate(test_X,test_y,verbose=0) print("LargeCNNError:%.2f%%"%(100-score[1]*100))
以上这篇keras分类之二分类实例(Catanddog)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。