2017-03-16 2 views
4

Ich versuche, eine Schicht (über Lambda-Schicht) zu implementieren, die die folgende numpy Prozedur tun:Wie die Losgröße innerhalb Lambda-Schicht bekommen

def func(x, n): 
    return np.concatenate((x[:, :n], np.tile(x[:, n:].mean(axis = 0), (x.shape[0], 1))), axis = 1) 

Ich bin stecken, weil ich nicht weiß, Wie man die Größe der ersten Dimension von x (das ist die Batch-Größe). Die Backend-Funktion int_shape(x) gibt (None, ...) zurück.

Also, wenn ich die batch_size weiß, würden die entsprechenden keras Verfahren sein:

def func(x, n): 
    return K.concatenate([x[:, :n], K.tile(K.mean(x[:, n:], axis=0), [batch_size, 1])], axis = 1) 
+0

Sie müssen 'batch_size' irgendwo in Ihrem Code festgelegt haben, verwenden Sie einfach diese Variable. Fehle ich etwas? –

+0

In meinem Setup hat jede Charge eine eigene Größe. – felagund

+0

Ich habe es versucht, aber K.int_shape (x) [0] = Keine. Ich vermute, dass int_shape die Größe nicht für den variierten Stapel zurückgibt, sondern die Eingabeform des Layers. Und das ist (None, n1, n2, ...), weil die erste Dimension eine Batch-Größe ist und ein beliebiger Wert sein kann. – felagund

Antwort

0

einen Funktor erstellen und die Losgröße bei der Initialisierung geben.

class SuperLoss: 
    def __init__(self,batch_size): 
     self.batch_size = batch_size 
    def __call__(self,y_true,y_pred): 
     self.batch_size .... 
+1

In meinem Setup hat jede Charge eine eigene Größe. Ich trainiere ein Modell mit model.fit_generator, also habe ich einen Generator, der Chargen erzeugt (und bei meinem Problem entstehen natürlich auch andere Chargengrößen). Also muss ich jedes Mal eine neue Batchgröße an einen Funktor übergeben. Gibt es eine Möglichkeit, dies zu tun? – felagund

Verwandte Themen