2017-08-08 1 views
3

Wenn ich das Modell mit der .fit() Ebene trainiere, ist das Argument shuffle auf True voreingestellt.Wie funktioniert shuffle = 'Batch' Argument der .fit() Schicht im Hintergrund?

Nehmen wir an, dass mein Datensatz 100 Proben hat und dass die Stapelgröße 10 ist. Wenn ich shuffle = True einstelle, wählt Keras zuerst zufällig die Stichproben (jetzt haben die 100 Stichproben eine andere Reihenfolge) und auf der neuen Bestellung wird es beginnen Erstellen der Chargen: Charge 1: 1-10, Charge 2: 11-20 etc.

Wenn ich shuffle = 'batch' wie soll es im Hintergrund arbeiten? Intuitiv und unter Verwendung des vorherigen Beispiels von 100 Proben-Datensätzen mit einer Chargengröße = 10 würde meine Vermutung sein, dass keras zuerst die Proben den Chargen zuordnet (dh Charge 1: Proben 1-10 nach der ursprünglichen Reihenfolge des Datensatzes, Charge 2: 11-20 folgend) die ursprüngliche Reihenfolge des Datensatzes, Stapel 3 ... so weiter) und mischt dann die Reihenfolge der Stapel. Das Modell wird nun an den zufällig angeordneten Chargen trainiert, zB: 3 (enthält die Proben 21 - 30), 4 (enthält die Proben 31 - 40), 7 (enthält die Proben 61 - 70), 1 (enthält die Proben 1 - 10), ... (Ich habe die Reihenfolge der Chargen zusammengestellt).

Ist mein Denken richtig oder fehlt mir etwas?

Danke!

Antwort

1

Betrachtet man die Implementierung dieser link (Zeile 349 von training.py), scheint die Antwort positiv zu sein.

diesen Code Versuchen zur Überprüfung:

import numpy as np 
def batch_shuffle(index_array, batch_size): 
    """Shuffles an array in a batch-wise fashion. 
    Useful for shuffling HDF5 arrays 
    (where one cannot access arbitrary indices). 
    # Arguments 
     index_array: array of indices to be shuffled. 
     batch_size: integer. 
    # Returns 
     The `index_array` array, shuffled in a batch-wise fashion. 
    """ 
    batch_count = int(len(index_array)/batch_size) 
    # to reshape we need to be cleanly divisible by batch size 
    # we stash extra items and reappend them after shuffling 
    last_batch = index_array[batch_count * batch_size:] 
    index_array = index_array[:batch_count * batch_size] 
    index_array = index_array.reshape((batch_count, batch_size)) 
    np.random.shuffle(index_array) 
    index_array = index_array.flatten() 
    return np.append(index_array, last_batch) 


x = np.array(range(100)) 
x_s = batch_shuffle(x,10) 
Verwandte Themen