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?
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
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? –
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. –