Как выполнить максимальное объединение строк или столбцов в keras

Я пытаюсь выполнить максимальное объединение строк и столбцов на уровне внимания, как описано в приведенной ниже ссылке: http://www.dfki.de/~neumann/ML4QAseminar2016/presentations/Attentive-Pooling-Network.pdf (слайд-15)

Я использую набор текстовых данных, в котором предложение передается в CNN. Каждое слово предложения было вставлено. Код для него следующий:

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"))    

Выходные данные CNN имеют форму (Нет, 256). Это действует как вход для слоя внимания. Может ли кто-нибудь предложить, как реализовать максимальное объединение строк или столбцов в keras с тензорным потоком в качестве бэкэнда?


person Purbasha    schedule 23.10.2017    source источник
comment
Объединение по чему? Какой у вас набор данных? Что ты пробовал? См. как создать минимальный жизнеспособный пример.   -  person charlesreid1    schedule 23.10.2017
comment
@ charlesreid1 Я использую набор текстовых данных. Подробную информацию о форме ввода см. В комментариях ниже.   -  person Purbasha    schedule 24.10.2017
comment
Я не понимаю, к чему относится текстовый набор данных. Измените свой вопрос, включив в него минимальный, полный, проверяемый пример.   -  person charlesreid1    schedule 24.10.2017
comment
@ charlesreid1 Найдите приведенную выше правку и дайте мне знать, понятно ли вам это или нет.   -  person Purbasha    schedule 24.10.2017


Ответы (1)


Если у вас есть изображения вдоль модели с формой (batch, width, height, channels), вы можете изменить форму данных, чтобы скрыть одно из пространственных измерений, и использовать одномерный пул:

По ширине:

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) 

По высоте:

#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()))

Рабочий пример, функциональная модель API с двумя ветвями, по одной для каждого пула:

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()

В качестве альтернативы Reshape, если вы не хотите беспокоиться о числах:

#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)))
person Daniel Möller    schedule 23.10.2017
comment
Я использую набор текстовых данных. Форма ввода - (Нет, 256). После нанесения слоя внимания я получаю форму (Нет, 1,1). Когда я использую Permute или TimeDistributed, кажется, что есть ошибка размера. Не могли бы вы помочь. - person Purbasha; 24.10.2017
comment
Вам нужно точно объяснить, что вы хотите сделать и какие измерения следует объединить. - person Daniel Möller; 24.10.2017
comment
Наверное, я неправильно наношу слой внимания. Я следовал приведенному ниже методу ссылки, но, похоже, он дал мне форму (None, 1,1). github.com/richliao/textClassifier/blob/master/ - person Purbasha; 24.10.2017
comment
Я скорректировал свой слой внимания и теперь получаю форму вывода как (?, 1000,200,1). Одна вещь, которую я не могу понять, когда я выполняю построчное объединение, предполагается, что он должен найти максимум для каждой строки и дать форму (?, 1000,1,1), но это дает форму (?, 500,200 , 1). почему это так? - person Purbasha; 27.10.2017
comment
Ах ... тогда вам нужен GlobalMaxPooling1D. - person Daniel Möller; 27.10.2017