方法一:将图片加载到内存中1.优点:不需要对数据进行分类2.缺点:对内存要求高,如果数据量太大,内存容量不够,容易造成计算机系统crash3.适用文件存放方式:无基础图片标签子文件夹4.代码实现定义文件夹路径TRAIN_DATA_PATH='E:/mldata/dogvscat/data/train/'TEST_DATA_PATH='E:/mldata/dogvscat/data//test1/'读取图片并制作datasetimgs_per_cat=1000image_size=(200,200)labels=[]train_images=[]foriteminos.listdir(TRAIN_DATA_PATH):print("train----"+str(item))img=image.load_img(os.path.join(TRAIN_DATA_PATH,str(item)),target_size=image_size)img=image.img_to_array(img)img=img/255.train_images.append(img)labels.append(item).split('.')[0])X=np.array(train_images)y=[]foriteminlabels:print("labels------"+str(item))ifitem=='cat':y.append(0)else:y.append(1)new_labels=pd.get_dummies(labels)我们esklearn中的train_test_split划分训练集和测试集X_train,X_test,y_train,y_test=train_test_split(X,new_labels,random_state=42,test_size=0.2)trainingmethod:model.fit(X_train,y_train,batch_size=32,epochs=100、验证_split=0.3)方法二:使用keras的ImageDataGenerator批量加载数据1.优点:批量加载数据2.缺点:需要根据标签将数据分文件夹3.适用文件存储方式:图片根据文件分文件到标签文件夹4.实现方法:创建文件夹base_dir='E:/mldata/dogvscat/cats_and_dogs_small'os.mkdir(base_dir)train_dir=os.path.join(base_dir,'train')os.mkdir(train_dir)validation_dir=os.path.join(base_dir,'validation')os.mkdir(validation_dir)test_dir=os.path.join(base_dir,'test')os.mkdir(test_dir)train_cats_dir=os.path.join(train_dir,'猫')os.mkdir(train_cats_dir)train_dogs_dir=os.path.join(train_dir,'dogs')os.mkdir(train_dogs_dir)validation_cats_dir=os.path.join(validation_dir,'cats')os.mkdir(validation_cats_dir)validation_os_dir=.path.join(validation_dir,'dogs')os.mkdir(validation_dogs_dir)test_cats_dir=os.path.join(test_dir,'cats')os.mkdir(test_cats_dir)test_dogs_dir=os.path.join(test_dir,'dogs')os.mkdir(test_dogs_dir)将文件复制到文件夹fnames=['cat.{}.jpg'.format(i)foriinrange(1000)]forfnameinfnames:src=os.path.join(原始数据set_dir,fname)dst=os.path.join(train_cats_dir,fname)shutil.copyfile(src,dst)fnames=['cat.{}.jpg'.format(i)foriinrange(1000,1500)]对于fnames中的fname:src=os.path.join(original_dataset_dir,fname)dst=os.path.join(validation_cats_dir,fname)shutil.copyfile(src,dst)fnames=['cat.{}.jpg'.format(i)foriinrange(1500,2000)]forfnameinfnames:src=os.path.join(original_dataset_dir,fname)dst=os.path.join(test_cats_dir,fname)shutil.copyfile(src,dst)fnames=['dog.{}.jpg'.format(i)foriinrange(1000)]forfnameinfnames:src=os.path.join(original_dataset_dir,fname)dst=os.path.join(train_dogs_dir,fname)shutil.copyfile(src,dst)fnames=['dog.{}.jpg'.format(i)foriinrange(1000,1500)]forfnameinfnames:src=os.path.join(original_dataset_dir,fname)dst=os.path.join(validation_dogs_dir,fname)shutil.copyfile(src,dst)fnames=['dog.{}.jpg'.format(i)foriinrange(1500,2000)]为了fnames中的fname:src=os.path.join(original_dataset_dir,fname)dst=os.path.join(test_dogs_dir,fname)shutil.copyfile(src,dst)使用ImageDataGenerator加载数据fromkeras.preprocessing.imageimportImageDataGeneratortrain_datagen=ImageDataGenerator(rescale=1./255)test_datagen=ImageDataGenerator(rescale=1./255)train_generator=train_datagen.flow_from_directory(train_dir,target_size=(150,150),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')训练方法history=model.fit_generator(train_generator,steps_per_epoch=100,epochs=30,validation_data=validation_generator,validation_steps=50)方法三:通过pandas加载数据labels_needed=['孟买','印花布','缅甸','喜马拉雅','芒奇金','布娃娃','西伯利亚','英国短毛猫','俄罗斯蓝','淡印花布']Filepaths=[]labels=[]forimage_fileinfile_list:label=image_file.split(os.path.sep)[-2]iflabelinlabels_needed:Filepaths.append(image_file)labels.append(label)#将数据转换成dataframedf=pd.DataFrame(list(zip(Filepaths,labels)),columns=['Filepath','Labels'])#将数据转打乱df=(df.sample(frac=1).reset_index()).drop(columns='index')train_ratio=.75validation_ratio=0.10test_ratio=0.25#计划数据集train,test=train_test_split(df,test_size=test_ratio)val,test=train_test_split(test,test_size=test_ratio/(test_ratio+validation_ratio))image_datagen=ImageDataGenerator(rescale=1./255,rotation_range=30,width_shift_range=0.2,height_shift_range=0.2,horizo??ntal_flip='true')#加载train数据x_train=image_datagen.flow_from_dataframe(dataframe=train,x_col='Filepath',y_col='Labels',target_size=(299,299),shuffle=False,batch_size=10,seed=10)#加载val数据x_val=image_datagen.flow_from_dataframe(dataframe=val,x_col='Filepath',y_col='Labels',target_size=(299,299),shuffle=False,batch_size=10,seed=10)#加载测试数据x_test=image_datagen.flow_from_dataframe(dataframe=test,x_col='Filepath',y_col='Labels',target_size=(299,299),shuffle=False,batch_size=10,种子=10)
