2017-10-23 1 views
0

Ich versuche, zeilenweise und spaltenweise max Pooling über eine Aufmerksamkeit Schicht durchzuführen, wie in dem unten stehenden Link beschrieben: http://www.dfki.de/~neumann/ML4QAseminar2016/presentations/Attentive-Pooling-Network.pdf (Dia-15)Wie zeilenweise oder spaltenweise max Pooling in keras auszuführen

I verwende Textdatensatz, wobei ein Satz CNN zugeführt wird. Jedes Wort des Satzes wurde eingebettet. Der Code dafür ist wie folgt:

model.add(Embedding(MAX_NB_WORDS, emb_dim, weights=[embedding_matrix],input_length=MAX_SEQUENCE_LENGTH, trainable=False)) 
model.add(Conv1D(k, FILTER_LENGTH, border_mode = "valid", activation = "relu"))  

Der Ausgang vom CNN ist von der Form (None, 256). Dies dient als Eingabe für die Aufmerksamkeitsschicht. Kann irgendjemand vorschlagen, wie man das Reihen-weise oder spaltenweise Max-Pooling in keras mit Tensorflow als Backend implementiert?

+0

Pooling über was? Was ist dein Datensatz? Was hast du probiert? Weitere Informationen finden Sie unter [Erstellen eines realistischen Beispiels] (https://stackoverflow.com/help/mcve). – charlesreid1

+0

@ charlesreid1 Ich verwende Textdatensatz. Bitte beachten Sie den folgenden Kommentar für Details der Eingabeform. – Purbasha

+0

Ich verstehe nicht, worauf sich "Text-Dataset" bezieht. Bitte bearbeiten Sie Ihre Frage so, dass sie ein [minimales, vollständiges, überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) enthält. – charlesreid1

Antwort

0

Wenn Sie Bilder auf Ihrem Modell mit Form haben (batch, width, height, channels), können Sie die Daten umformen einen der räumlichen Dimensionen zu verstecken und ein 1D-Pooling verwenden:

Für die Breite:

model.add(Reshape((width, height*channels))) 
model.add(MaxPooling1D()) 
model.add(Reshape((width/2, height, channels))) #if you had an odd number, add +1 or -1 (one of them will work) 

Für die Höhe:

#Here, the time distributed will consider that "width" is an extra time dimension, 
#and will simply think of it as an extra "batch" dimension 
model.add(TimeDistributed(MaxPooling1D())) 

Arbeitsbeispiel, funktionelles API-Modell mit zwei Zweigen, eine für jedes Pooling:

import numpy as np 
from keras.layers import * 
from keras.models import * 

inp = Input((30,50,4)) 
out1 = Reshape((30,200))(inp) 
out1 = MaxPooling1D()(out1) 
out1 = Reshape((15,50,4))(out1) 
out2 = TimeDistributed(MaxPooling1D())(inp) 

model = Model(inp,[out1,out2]) 
model.summary() 

Alternativ zu Reshape, falls Sie nicht wollen, um die Zahlen zu stören:

#swap height and width 
model.add(Permute((2,1,3))) 

#apply the pooling to width 
model.add(TimeDistributed(MaxPooling1D())) 

#bring height and width to the correct order 
model.add(Permute((2,1,3))) 
+0

Ich verwende Textdatensatz. Die Eingabeform ist (None, 256). Nach dem Auftragen der Aufmerksamkeitsschicht erhält ich eine Form von (None, 1,1). Wenn ich Permute oder TimeDistributed verwende, scheint es Dimensionsfehler zu haben. Könnten Sie bitte helfen? – Purbasha

+0

Es ist nicht möglich, Pooling in einer 1x1-Form durchzuführen. –

+0

Sie müssen genau erklären, was Sie tun möchten und welche Dimensionen gepoolt werden sollen. –

Verwandte Themen