データアナリスト養成の道---kerasは自分のデータセットを実現する
8804 ワード
データ準備:トレーニング、テスト用のフォルダ(training,testing)を作成し(もちろん検証専用のフォルダ(vassidation)、ここで検証とテストを一緒にしてもよい)、training,testingのサブフォルダを作成し、A,B,この2つのサブフォルダはカテゴリ(A,Bの2つ、複数の場合、A,B,C...)で、traing/A traing/B testing/A testing/B注意:フォルダ内のデータが十分であることを保証する(深さの学習をして、データ量は基礎で、もちろん、サンプリングして、重みを調節して、データの強化などの方法もデータ量が一定に達する基礎の上で、データが少なすぎて、分布があまりにも不均衡で、親は深さの学習を考慮しないでください)データを読み取る:構想:
1.フォルダから直接データを読み取ってデータを増強する
以上、train_data_dirはトレーニングセットのパス、/traing,test_data_dirはテストセットのパスであり,/testing後,構築したモデルモデルを用いて訓練を行うことができる.
説明、以上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を読み出す.分かりやすいように、次のコードを見てください.
各ピクチャの完全なパス名を取得すると、各ピクチャを読み取ることができます.
以上より、dfに書き込まれ、1つの列には各ピクチャの完全なパス名(後で読み出すのに便利)が配置され、もう1つの列にはカテゴリ(A,B....)が配置され、その後、dfをそのまま使用すれば、前に書いたコードを以下に貼り付け、参考にします.
dfのデータをどのように読み込みますか?ルソンは以下のコードを参考にします.
その呼び出し
そう、得られたiter_trainはジェネレータ(内部データはデータ増強などの操作が可能で、自分でパラメータを設定する必要がある)にcallbacksを後で書き換えるのを容易にするために、ここでもう一歩処理します
vli?
next()ごとに生成されたデータを表示した後、モデルを訓練します.
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...)