2016-08-02 12 views
0

Ich versuche mit nolearn zu arbeiten und benutze den ConcatLayer, um mehrere Eingaben zu kombinieren. Es funktioniert gut, solange jeder Eingang den gleichen Typ und die gleiche Form hat. Ich habe drei verschiedene Arten von Eingängen, die schließlich einen einzelnen skalaren Ausgangswert erzeugen.Ich versuche, ConcatLayer mit verschiedenen Formeingaben zu verwenden

  • Der erste Eingang ist ein Bild von Dimensionen (288,1001)

  • Der zweite Eingang ist ein Vektor der Länge 87

  • Der dritte ist ein einzelner skalarer Wert

Ich verwende Conv2DLayer (s) am ersten Eingang. Der zweite Eingang verwendet Conv1DLayer oder DenseLayer (nicht sicher, was wäre besser, da ich es nicht weit genug bekomme, um zu sehen, was passiert) Ich bin nicht einmal sicher, wie der dritte Eingang eingerichtet werden sollte, da es nur eine einzige ist Wert, den ich in das Netzwerk einspeisen möchte.

Der Code bläst am ConcatLayer oben mit: :

Es wäre für immer dankbar ‚Mismatch Eingabeformen gleich, außer in der Verkettung Achse sein muss‘, wenn jemand eine super einfach Netzwerkstruktur ausschreiben könnte das kann diese Arten von Eingaben annehmen und einen einzelnen Skalarwert ausgeben. Ich habe den ganzen Tag gegoogelt und kann das einfach nicht herausfinden.

Die Fit-Funktion sieht wie folgt aus, wenn es hilfreich zu wissen, wie man sehen kann ich für jede Art von Eingabe ein Wörterbuch mit einem Gegenstand am Eingabe:

X = {'base_input': X_base, 'header_input': X_headers, 'time_input':X_time} 
net.fit(X, y) 

Antwort

1

Es ist schwer, richtig, die Frage zu beantworten , weil - es hängt davon ab. Ohne Informationen darüber zu haben, was Sie vorhaben und an welchen Daten Sie arbeiten, spielen wir hier das Ratespiel und ich muss daher auf allgemeine Tipps zurückgreifen.

Zuerst ist es völlig in Ordnung, dass ConcatLayer sich beschwert. Es ist einfach nicht sinnvoll, einen Skalar an die Pixelwerte eines Bildes anzuhängen. Also solltest du darüber nachdenken, was du eigentlich willst. Dies ist höchstwahrscheinlich eine Kombination der Informationen der drei Quellen.

Sie haben recht, indem Sie vorschlagen, das Bild mit 2D-Faltungen und den Sequenzdaten mit 1D-Faltungen zu verarbeiten. Wenn Sie einen skalaren Wert erzeugen möchten, möchten Sie wahrscheinlich später dichte Schichten verwenden, um die Informationen zu verdichten. So wäre es natürlich, die Lowlevel-Verarbeitung der drei Zweige unabhängig zu lassen und sie später zu verketten.

Etwas entlang der Linien von:

Image -> conv -> ... -> conv -> dense -> ... -> dense -> imValues 
Timeseries -> conv -> ... -> conv -> dense ... -> dense -> seriesValues 
concatLayer([imValues, seriesValues, Scalar] -> dense -> ... -> dense with num_units=1 

Eine andere, weniger häufig vernünftige Option wäre, die Informationen am lowlevel Verarbeitung des Bildes hinzuzufügen. Dies kann sinnvoll sein, wenn die lokale Verarbeitung aufgrund der Kenntnisse der Skalar-/Zeitreihen viel einfacher ist.

könnte Diese Architektur wie folgt aussehen:

concatLayer(seriesValues, scalar) -> dense -> ... -> reshape((-1, N, 1, 1)) 
    -> Upscale2DLayer(Image.shape[2:3]) -> globalInformation 
concatLayer([globalInformation, Image]) -> 2D conv filtersize=1 -> conv -> ... -> conv 

Beachten Sie, dass Sie fast sicher mit der ersten Option gehen wollen.

Eine nicht verwandte Sache, die ich bemerkte, ist die riesige Größe Ihres Eingangsbildes. Sie sollten es reduzieren (Größenanpassung/Patches). Wenn Sie nicht über eine riesige Menge an Daten und jede Menge Speicher und Rechenleistung verfügen, werden Sie Hardware entweder überfrachten oder verschwenden.

+0

Aus irgendeinem Grund kam mir nicht in den Sinn, dass ich mit DenseLayer umgestalten könnte. Ich denke, ich dachte, dass die Bibliothek einen Weg haben würde, die Verschmelzung zu machen, aber bei weiterer Betrachtung wurde mir klar, dass ein solcher Prozess wahrscheinlich nicht mit vernünftigen Vorgaben verallgemeinert werden konnte. Was dann offensichtlich machte, dass ich die Schichten bereitstellen musste, die notwendig waren, um sich neu zu formen. Danke für deine sehr hilfreiche Antwort! – Beaker