2017-06-29 4 views
0

Ich habe gesucht und gefunden ähnliche Probleme, aber keine, die scheinen das gleiche Problem als das, was ich gegenüberstehen. Ich versuche ein neurales Netzwerk mit Keras zu implementieren, das das Theano-Backend verwendet (beide aktuell), was eine Lambda-Schicht beinhaltet, die die 1-dimensionale Ausgabe einer Ebene aufnimmt und sie in einen n-dimensionalen Vektor umwandelt. d Ausgabe wiederholt n mal.Broadcasting-Problem beim Hinzufügen Keras Lambda-Layer mit unterschiedlicher Größe Eingabe und Ausgabe

Das Problem, das ich scheinen in zu laufen ist, dass an der Lambda-Schicht erwartet werden Keras scheint, dass die Eingabe die gleiche Dimension wie die Ausgangsform hat ich spezifizieren:

x=Input(shape=(2,)) 
V1=Dense(1)(x) 
V2=Lambda(lambda B : B[0,0]*K.ones((3,)),output_shape=(3,))(V1) 
model=Model(inputs=x,outputs=V2) 
rms = RMSprop() 
model.compile(loss='mse', optimizer=rms) 
model.predict(np.array([1,2]).reshape((1,2))) 

, die das gibt Fehler:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-7-40a7e91d5963> in <module>() 
----> 1 model.predict(np.array([1,2]).reshape((1,2))) 

/Users/user/anaconda/envs/py35/lib/python3.5/site-packages/keras/engine /training.py in predict(self, x, batch_size, verbose) 
    1504   f = self.predict_function 
    1505   return self._predict_loop(f, ins, 
-> 1506         batch_size=batch_size, verbose=verbose) 
    1507 
    1508  def train_on_batch(self, x, y, 

/Users/user/anaconda/envs/py35/lib/python3.5/site-packages/keras/engine/training.py in _predict_loop(self, f, ins, batch_size, verbose) 
    1137 
    1138    for i, batch_out in enumerate(batch_outs): 
-> 1139     outs[i][batch_start:batch_end] = batch_out 
    1140    if verbose == 1: 
    1141     progbar.update(batch_end) 

ValueError: could not broadcast input array from shape (3) into shape (1) 

ich weiß, es gibt andere Wege, um zu versuchen, diese (K.repeat_elements) zu tun, aber das hat auch mir Fehlermeldungen über Rundfunk gegeben. Beachten Sie, das Problem bleibt bestehen, auch wenn ich die B[0,0]* entfernen (so dass die Lambda-Schicht nicht auf B überhaupt abhängt). Wenn ich die (3,) in K.ones und output_shape zu (1,) ändere dann scheint es zu funktionieren.

Von dem, was ich verstehe, sollten die Lambda-Schichten in der Lage sein, Eingabe/Ausgabe-Paare unterschiedlicher Dimension zu behandeln, ist das richtig?

Antwort

0

In output_shape berücksichtigen Sie nicht die Batch-Größe. Also das ist richtig: (3,)

Aber in Tensoren wird die Batch-Größe nicht ignoriert. Sie benötigen im Ergebnis Ihres Ausdrucks mindestens zwei Dimensionen: (Batch_size, 3).

Verwenden Sie auch keine Elemente der Tensoren, verwenden Sie die gesamten Tensoren. Ich habe nicht einen Fall gefunden, wo es wichtig oder nützlich wäre, getrennte Elemente zu verwenden (da Sie angeblich sind genau die gleiche Operation auf die gesamte Charge zu tun)

Ich schlage vor, Sie verwenden K.repeat_elements(B, rep=3, axis=-1)

+0

Sehr hilfreich, Vielen Dank. Ich vermute, der Punkt der Verwirrung für mich war, dass in 'output_shape' die Batch-Größe den zweiten Punkt im Tupel belegt, während beim Definieren des' K.ones'-Tensors in der Lambda-Funktion die Batch-Größe in den ersten Slot geht. Kannst du mir eine Idee geben, warum das so ist? In diesem Sinne funktionieren beide Vorschläge (nach dem Umformen des 'K.repeat_elements' Tensors). Vielen Dank! – hughes

+0

Nein, die Losgröße nimmt immer die erste Position ein. Ich weiß nicht, warum es ein Komma in '(3,)' gibt, aber es bedeutet nichts Nützliches. Sie müssen nur das Komma setzen, wenn Sie nur eine Dimension haben. Wenn Sie (Keine, 3) haben, definieren Sie es als (3,). Wenn Sie (Keine, 3, 4) haben, definieren Sie es als (3,4). - Es ist wahrscheinlich nur ein Notationsproblem, vielleicht ist es notwendig, mindestens ein Komma zu haben, um ein Tupel zu erstellen? –

+0

Wenn die Antwort für Sie in Ordnung ist, erwägen Sie, sie als beantwortet zu markieren :) - Das hilft anderen Benutzern bei der Suche nach einer Antwort. –

Verwandte Themen