データアナリスト養成の道---kerasは自分のデータセットを実現する


データ準備:トレーニング、テスト用のフォルダ(training,testing)を作成し(もちろん検証専用のフォルダ(vassidation)、ここで検証とテストを一緒にしてもよい)、training,testingのサブフォルダを作成し、A,B,この2つのサブフォルダはカテゴリ(A,Bの2つ、複数の場合、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.fit_generator(train_generator,...validation_data=test_generator...)

説明、以上validation_Dataは、前述の規定に従って、ここではテストセットジェネレータを使用して、もちろんvalidation_を置き換えることができます.generatorは各batchを訓練し、loss、acc(complileのmetrics=[accuracy]の場合)、各epoch(1ラウンド)を訓練し、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に書き込まれ、1つの列には各ピクチャの完全なパス名(後で読み出すのに便利)が配置され、もう1つの列にはカテゴリ(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...)