数据分析师养成之路---keras实现自己的数据集

数据准备:
建立几个文件夹(处于方便起见),
用于训练,测试的文件夹(training,testing)(当然也可以留一部分专门用于验证的文件夹(vassidation),这里,验证和测试放一起了)
然后创建training,testing的子文件夹,A,B,这两个子文件夹是类别(A,B两类,多类的话,A,B,C…)
成如下效果:
traing/A
traing/B
testing/A
testing/B
注意:
保证文件夹中的数据充分(用做深度学习,数据量是基础,当然,上采样,调节权重,数据增强等方法也是要在数据量达到一定的基础上,数据太少,分布太不均衡,亲就不要考虑深度学习了)
读取数据:
思路:

1.直接从文件夹中读取数据进行数据增强

train_datagen=ImageDataGenerator(...)
test_datagen=ImageDataGenerator(...)
train_generator=train_datagen.flow_from_directory(train_data_dir,...)
test_generator=test_datagen.flow_from_directory(test_data_dir,...)

如上,train_data_dir 即为训练集的路径 , /traing,test_data_dir即为测试集中的路径,/testing
再之后,我们便可以用建立好的模型model,来进行训练了

model.fit_generator(train_generator,...validation_data=test_generator...)

说明,以上validation_data,由前面规定,这里用测试集生成器,当然亲可以替换validation_generator
训练每个batch,会显示loss,acc(complile的metrics=[accuracy]时),训练每个epoch(一轮),会显示loss,val,val_loss,val_acc
(fit,fit_generator的显示结果,如需显示其他,需要自己设置,fit的callback中,以及compile的metrics中可自定义修改,详情见后篇)
2.将文件夹中的数据写入df中,后读取df.
为便于理解,请看如下代码

# 训练文件夹下所有分类为A的图像
train_A_dir=os.path.join(train_data_dir,'A')
# 每个train_A_name即为每张图片的完整路径名
for train_A in os.listdir(train_A_dir):
    train_A_name=os.path.join(train_A_dir,train_A)
...

得到每张图片的完整路径名,我们即可以读取每张图片

#通过路径名读取该图片
mat=io.imread(train_A_name)

由上,我们将其写入df中,一列放每张图片的完整路径名(方便之后读取)另一列放它的类别(A,B….),之后直接使用df即可
之前写过的代码贴在下面,作为参考:

class Dataframe(object):
    def __init__(self,read_path):
        self.read_path=read_path
    def find1(self):
        png_1=[]
        label_1=[]
        dir_1=os.path.join(self.read_path,'B')
        for filename in os.listdir(dir_1):
            png_1.append(os.path.join(dir_1,filename))
            label_1.append(1)
        df_1=pd.DataFrame({'png':png_1,'label':label_1})
        return df_1
    def find0(self):
        png_0=[]
        label_0=[]
        dir_0=os.path.join(self.read_path,'A')
        for filename in os.listdir(dir_0):
            png_0.append(os.path.join(dir_0,filename))
            label_0.append(0)
        df_0=pd.DataFrame({'png':png_0,'label':label_0})
        return df_0
    def createDf(self):
        df=pd.concat([self.find0(),self.find1()],axis=0)
        # 将样本打乱
        df=df.sample(frac=1)
        return df

如何读取df中的数据?
鲁先森放如下代码供参考

class ReadDataFromDF(object):
    def __init__(self,df,batch_size=2,transforms=False,IsTrain=False,zoom_size=(224,224)):
        self.df=df
        self.batch_size=batch_size
        self.transforms=transforms
        self.IsTrain=IsTrain
        self.zoom_size=zoom_size
    def ReadData(self):#include dataaugment
        for index in range(len(self.df)//2):
            df_batch=self.df.sample(self.batch_size)
            x=[]
            filenames=df_batch['png'].values
            for filename in filenames:
                mat=io.imread(filename)
                mat=np.repeat(mat,3).reshape(400,400,3)
                mat=transform.resize(mat,self.zoom_size,mode='reflect') # 缩放图片
                if self.transforms:
                    mat=self.DataAugment().random_transform(mat)
                x.append(mat)
            x=np.array(x)
            y=df_batch['label'].values
            y=utils.to_categorical(y,2)
            yield x,y
    def DataAugment(self):
        if self.IsTrain:
            datagen=ImageDataGenerator(
                                    rescale=1. / 255,
                                    shear_range=0.1,
                                    zoom_range=0.1,
                                    horizontal_flip=True,
                                    vertical_flip=False,
                                    width_shift_range=0.2,
                                    height_shift_range=0.2,
                                    rotation_range=0.2,
                                    fill_mode='nearest')
        else:
            datagen=ImageDataGenerator(rescale=1. / 255)
        return datagen

其调用

rdf=ReadDataFromDF(df)
rdf.batch_size=16
iter_train=rdf.ReadData()

没错,所得到的iter_train即为生成器(里面数据可进行数据增强等操作,需要自己设置参数)
为了便于之后重写callbacks,这里再做一步处理

def validata(iter_train):
    for index in iter_train:
        yield index
vli=validata(iter_train)

vli?

next(vli)
next(vli)
...

每next()一次,显示一批所生成的数据
之后,训练模型

model.fit_generator(iter_train,...validation_data=iter_test...)

猜你喜欢

转载自blog.csdn.net/lulujiang1996/article/details/81110723