2016-08-06 26 views
6

diese Frage in Bezug auf das gemeinsame Problem der Ausbildung auf mehrere große Dateien in Keras, die gemeinsam zu groß sind, auf GPU-Speicher zu passen. Ich benutze Keras 1.0.5 und ich möchte eine Lösung, die 1.0.6 nicht erfordert. Eine Möglichkeit, dies zu tun, wurde von fchollet beschrieben here und here:Keras: Batch-Training für mehrere große Datensätze

# Create generator that yields (current features X, current labels y) 
def BatchGenerator(files): 
    for file in files: 
     current_data = pickle.load(open("file", "rb")) 
     X_train = current_data[:,:-1] 
     y_train = current_data[:,-1] 
     yield (X_train, y_train) 

# train model on each dataset 
for epoch in range(n_epochs): 
    for (X_train, y_train) in BatchGenerator(files): 
     model.fit(X_train, y_train, batch_size = 32, nb_epoch = 1) 

aber ich fürchte, dass der Zustand des Modells wird nicht gespeichert, sondern, dass das Modell nicht nur zwischen den Epochen neu initialisiert wird, sondern auch zwischen den Datensatz . Jede "Epoche 1/1" stellt Ausbildung auf einem anderen Daten-Set unter:

~~~~~ Epoch 0 ~~~~~~

Epoch 1/1 295806/295806 [===== =========================] - 13s - Verlust: 15,7517
Epoch 1/1 407890/407890 [======= =======================] - 19s - Verlust: 15,8036
Epoch 1/1 383188/383188 [========= =====================] - 19s - Verlust: 15,8130
~~~~~ Epoch 1 ~~~~~~

Epoch 1/1 295806/295806 [==============================] - 14s - Verlust: 15.7517
Epoche 1/1 407890/407.890 [==============================] - 20s - Verlust: 15,8036
Epoch 1/1 383188/383188 [===========================] - 15s - verlust: 15.8130

mir ist bewusst, dass man modell verwenden kann .fit_generator, aber da die obige Methode immer wieder als eine Art Batch-Training vorgeschlagen wurde, würde ich gerne wissen, was ich falsch mache.

Danke für Ihre Hilfe,

Max

+0

Haben Sie (sollten selbsterklärend sein) versucht Ihr Experiment auf CPU in kleinen Chargen laufen durch Ihre große Dateien in kleinere Stücke zu brechen? –

+2

ziemlich sicher, dass Sie benötigen fit_generator verwenden, finden Sie https://keras.io/models/sequential/ – shell

+0

Beule, jeder ein? Mit fit_generator scheint nicht der kürzeste Weg zu sein. – kulssaka

Antwort

0

Es ist schon eine Weile her, seit ich das Problem, aber ich erinnere mich, dass ich
Kera's functionality to provide data through Python generators, das heißt model = Sequential(); model.fit_generator(...) verwendet.

Eine beispielhafte Code-Schnipsel

def generate_batches(files, batch_size): 
    counter = 0 
    while True: 
    fname = files[counter] 
    print(fname) 
    counter = (counter + 1) % len(files) 
    data_bundle = pickle.load(open(fname, "rb")) 
    X_train = data_bundle[0].astype(np.float32) 
    y_train = data_bundle[1].astype(np.float32) 
    y_train = y_train.flatten() 
    for cbatch in range(0, X_train.shape[0], batch_size): 
     yield (X_train[cbatch:(cbatch + batch_size),:,:], y_train[cbatch:(cbatch + batch_size)]) 

model = Sequential() 
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy']) 

train_files = [train_bundle_loc + "bundle_" + cb.__str__() for cb in range(nb_train_bundles)] 
gen = generate_batches(files=train_files, batch_size=batch_size) 
history = model.fit_generator(gen, samples_per_epoch=samples_per_epoch, nb_epoch=num_epoch,verbose=1, class_weight=class_weights) 
+0

Wie würde dies gehandhabt, wenn die Trainingsdaten in einer Datei sind? Ich kann es laden, kann aber aufgrund von Ressourcenfehlern keine 3 Ebenen erstellen. – onaclov2000

+0

nur in mehrere Dateien aufteilen, oder ist das nicht möglich? – tenticon

+0

Hallo @tenticon, ich habe eine Abfrage mit Ihrem letzten Code. Trainiert es bei jeder Charge num_epochs oder trainiere insgesamt alle Chargen in einer Epoche dann gehts zur zweiten? –