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)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。