当前位置: 首页 > 后端技术 > Python

深度学习实践-catsvsdogs数据集

时间:2023-03-25 21:23:52 Python

1.下载数据集数??据集来自kaggle数据集DogsvsCatsdataset百度云盘下载地址链接:https://pan.baidu.com/s/177uL...提取码:9j402.划分数据1.创建文件夹如下:traincatsdogsvalcatsdogstest2。划分数据,代码如下defdata_cats_processing():base_train_path=r'E:\mldata\dogvscat\data\train'base_dest_train_path=r'E:\mldata\dogvscat\train\cats'base_dest_test_path=r'E:\mldata\dogvscat\test\cats'base_dest_val_path=r'E:\mldata\dogvscat\val\cats'cat_fnames=['cat.{}.jpg'.format(i)foriinrange(10000)]forfname在cat_fnames中:src_path=os.path.join(base_train_path,fname)dest_path=os.path.join(base_dest_train_path,fname)shutil.copyfile(src_path,dest_path)cat_fnames=['cat.{}.jpg'.format(i)foriinrange(10001,11501)]forfnameincat_fnames:src_path=os.path.join(base_train_path,fname)dest_path=os.path.join(base_dest_val_path,fname)shutil.copyfile(src_path,dest_path)cat_fnames=['cat.{}.jpg'.format(i)foriinrange(11501,12500)]forfnameincat_fnames:src_path=os.path.join(base_train_path,fname)dest_path=os.path.join(base_dest_test_path,fname)shutil.copyfile(src_path,dest_path)defdata_dog_processing():base_train_path=r'E:\mldata\dogvscat\data\train'base_dest_train_path=r'E:\mldata\dogvscat\train\dogs'base_dest_test_path=r'E:\mldata\dogvscat\test\dogs'base_dest_val_path=r'E:\mldata\dogvscat\val\dogs'dog_fnames=['dog.{}.jpg'.format(i)foriinrange(10000)]forfnameindog_fnames:src_path=os.path.join(base_train_path,fname)dest_path=os.path.join(base_dest_train_path,fname)shutil.copyfile(src_path,dest_path)dog_fnames=['dog.{}.jpg'.format(i)foriinrange(10001,11501)]forfnameindog_fnames:src_path=os.path.join(base_train_path,fname)dest_path=os.path.join(base_dest_val_path,fname)shutil.copyfile(src_path,dest_path)dog_fnames=['dog.{}.jpg'.format(i)foriinrange(11501,12500)]forfnameindog_fnames:src_path=os.path.join(base_train_path,fname)dest_path=os.path.ImageDataGenerator(rescale=1/255.)train_dir=r'E:\mldata\dogvscat\train'val_dir=r'E:\mldata\dogvscat\val'train_datagen=train_datagen.flow_from_directory(train_dir,目标大小=(150,150),batch_size=20,class_mode='binary')val_datagen=test_datagen.flow_from_directory(val_dir,target_size=(150,150),batch_size=20,class_mode='binary')returntrain_datagen,val_datagen4.创建神经网络模型neuralnetworkdefcreate_model2():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)))模型。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'))model.compile(loss='binary_crossentropy',optimizer=RMSprop(learning_rate=1e-4),metrics=['acc'])返回模型5.开始训练#加载数据train_datagen,val_datagen=datagen()#创建模型model=create_model2()#创建tensorboard使用的日志文件夹log_dir="logs/fit/"+datetime.datetime.now().strftime("%Y%m%d-%H%M%S")#创建张量板回调回调tensorboard_callback=callbacks.TensorBoard(log_dir=log_dir,histogram_freq=1)#开始训练model.fit_generator(train_datagen,steps_per_epoch=100,epochs=100,validation_data=val_datagen,validation_steps=50,callbacks=[tensorboard_callback])训练结果:Epoch96/100100/100[=================================]-82s819ms/step-loss:0.1315-acc:0.9507-val_loss:0.4925-val_acc:0.8200Epoch97/100100/100[==============================]-87秒866毫秒/步-损失:0.1234-加速:0.9537-val_loss:0.3646-val_acc:0.8706Epoch98/100100/100[===================================]-87秒872毫秒/步-损失:0.1209-加速:0.9542-val_loss:0.3609-val_acc:0.8619Epoch99/100100/100[===================================]-77s769ms/step-loss:0.1225-acc:0.9521-val_loss:0.3553-val_acc:0.8731Epoch100/100100/100[================================]-73s731ms/step-loss:0.1213-acc:0.9544-val_loss:0.4488-val_acc:0.8444结果分析:1.训练精度可以达到0.95,并且可以改进。2.训练精度0.95,验证精度0.85,严重过拟合解决方案:TrainingLargerNetworksUsingAdamtoOptimizeIncreasedUniversity学习率修改模型如下:defbase_model1():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(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)))模型.add(Flatten())model.add(Dense(512,activation='relu'))model.add(Dense(1,activation='sigmoid'))model.compile(loss='binary_crossentropy',optimizer=Adam(learning_rate=1e-3),metrics=['acc'])结果:Epoch95/100100/100[==============================]-55s551ms/step-loss:0.0693-acc:0.9763-val_loss:0.5669-val_acc:0.8694Epoch96/100100/100[==============================]-51秒513毫秒/步-损失:0.0528-一个cc:0.9814-val_loss:0.4546-val_acc:0.8800Epoch97/100100/100[=================================]-55s550ms/step-loss:0.0351-acc:0.9870-val_loss:0.6491-val_acc:0.8756Epoch98/100100/100[================================]-55s551ms/step-loss:0.0328-acc:0.9894-val_loss:0.6218-val_acc:0.8694Epoch99/100100/100[================================]-51秒514毫秒/步-损失:0.0899-加速:0.9699-val_loss:0.4788-val_acc:0.8744Epoch100/100100/100[=================================]-57秒566毫秒/步-损失:0.0361-加速:0.9877-val_loss:0.5918-val_acc:0.8775结果分析:训练精度提高到0.9877但验证精度只有0.8775,严重过拟合解决方法:尝试使用Dropout和L2正则化解决修改后的模型:defbase_model1():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),激活='relu'))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())#添加Dropoutmodel.add(Dropout(0.2))#model.add(Dense(512,activation='relu'))model.add(Dense(512,activation='relu',kernel_regularizer=regularizers.L2(0.01)))model.add(Dense(1、activation='sigmoid'))model.compile(loss='binary_crossentropy',optimizer=Adam(learning_rate=1e-3),metrics=['acc'])返回模型训练结果:可以看到过拟合了降低了,但是还是有很高的过拟合,训练精度也降低了。解决方法:增加数据集,扩容数据集到20万,修改数据读取,数据下载地址:链接:https://pan.baidu.com/s/1nC6W...提取码:6h20defdatagen():#在keras中使用ImageDataGenerator批量加载图片train_datagen=ImageDataGenerator(rescale=1/255.)test_datagen=ImageDataGenerator(rescale=1/255.)train_dir=r'E:\mldata\dogvscat\train'val_dir=r'E:\mldata\dogvscat\val'train_datagen=train_datagen.flow_from_directory(train_dir,target_size=(150,150),batch_size=32,class_mode='binary')val_datagen=test_datagen.flow_from_directory(val_dir,target_size=(150,150),batch_size=32,class_mode='binary')returntrain_datagen,val_datagen最终计算结果:Epoch95/100100/100[==============================]-143s1s/步骤-损失:0.0994-acc:0.9683-val_loss:0.1546-val_acc:0.9447Epoch96/100100/100[==============================]-129s1s/step-loss:0.0990-acc:0.9632-val_loss:0.1641-val_acc:0.9353Epoch97/100100/100[==============================]-128s1s/step-loss:0.1072-acc:0.9632-val_loss:0.1564-val_acc:0.9441Epoch98/100100/100[==============================]-135s1s/step-loss:0.1132-acc:0.9604-val_loss:0.1509-val_acc:0.9456Epoch99/100100/100[==============================]-149秒1秒/步-损失:0.1035-加速:0.9644-val_loss:0.1327-val_acc:0.9536Epoch100/100100/100[==============================]-155s2s/步骤-损失:0.0958-acc:0.9717-val_loss:0.1491-val_acc:0.9464