たとえば、csvがあり、画像やその他の機能がファイルに含まれているとします。
ここでidは画像名を表し、その後に機能が続き、その後にターゲットが続きます(分類のクラス、再生成の番号)
最初にデータジェネレーターを定義し、後でオーバーライドできます。
pandasデータフレームのcsvからデータを読み取り、kerasのflow_from_dataframeを使用してデータフレームから読み取ります。
df = pandas.read_csv("dummycsv.csv")
datagen = ImageDataGenerator(rescale=1/255.)
generator = datagen.flow_from_dataframe(df,directory="out/",x_col="id",y_col=df.columns[1:],class_mode="raw",batch_size=1)
ImageDataGeneratorでいつでも拡張機能を追加できます。
上記のflow_from_dataframeのコードで注意すべき点は
x_col =画像名
y_col =通常はクラス名を含む列ですが、csv内の他のすべての列を最初に指定することで、後でオーバーライドできます。つまり、feat_1、feat_2 .... class_labelまで
class_mode = raw、yのすべての値をそのまま返すようジェネレーターに提案します。
ここで、上記のジェネレーターをオーバーライド/継承し、新しいものを作成して、[img、otherfeatures]、[target]を返すようにします。
ここに説明付きのコメント付きのコードがあります
def my_custom_generator():
count = 0 #to keep track of complete epoch
while True:
if(count==len(df.index)):
#if the count is matching with the length of df, the one pass is completed, so reset the generator
generator.reset()
break
count+=1
data = generator.next() #get the data from the generator
#the data looks like this [[img,img] , [other_cols,other_cols]] based on the batch size
imgs = []
cols = []
targets = []
#iterate the data and append the necessary columns in the corresponding arrays
for k in range(batch_size):
imgs.append(data[0][k]) #the first array contains all images
cols.append(data[1][k][:-1]) #the second array contains all features with last column as class, so [:-1]
targets.append(data[1][k][-1]) #the last column in the second array from data is the class
yield [imgs,cols],targets #this will yield the result as you expect.
検証ジェネレーターに同様の関数を作成します。必要に応じてtrain_test_splitを使用してデータフレームを分割し、2つのジェネレータを作成してオーバーライドします。
このように関数をmodel.fit_generatorに渡します
model.fit_generator(my_custom_generator(),.....other params)
flow
必要flow_from_directory
ですか?(flow
すべての画像をメモリにロードしたままにできることを意味します)