Объединение слоев конкатенации с разными размерами фильтров в CNTK

В CNTK - как я могу использовать фильтры нескольких размеров на одном слое (например, размеры фильтров 2,3,4,5)?

После проделанной работы здесь (ссылка на код в github ниже(1)), я хочу возьмите текст, используйте встраивающий слой, примените фильтры четырех разных размеров (2,3,4,5), объедините результаты и передайте их на полностью связанный слой. Рисунок сетевой архитектуры

Пример кода Keras:

main_input = Input(shape=(100,) 
embedding = Embedding(output_dim=32, input_dim=100, input_length=100, dropout=0)(main_input)

conv1 = getconvmodel(2,256)(embedding)
conv2 = getconvmodel(3,256)(embedding)
conv3 = getconvmodel(4,256)(embedding)
conv4 = getconvmodel(5,256)(embedding)

merged = merge([conv1,conv2,conv3,conv4],mode="concat")

def getconvmodel(filter_length,nb_filter):
    model = Sequential()
    model.add(Convolution1D(nb_filter=nb_filter,
                            `enter code here`input_shape=(100,32),
                            filter_length=filter_length,
                            border_mode='same',
                            activation='relu',
                            subsample_length=1))
    model.add(Lambda(sum_1d, output_shape=(nb_filter,)))
    #model.add(BatchNormalization(mode=0))
    model.add(Dropout(0.5))
    return model

(1): /joshsaxe/eXposeDeepNeuralNetwork/blob/master/src/modeling/models.py


person Amirubin    schedule 25.05.2017    source источник


Ответы (2)


Вы можете сделать что-то вроде этого:

import cntk as C
import cntk.layers as cl

def getconvmodel(filter_length,nb_filter):
    @Function
    def model(x):
        f = cl.Convolution(filter_length, nb_filter, activation=C.relu))(x)
        f = C.reduce_sum(f, axis=0)
        f = cl.Dropout(0.5) (f)
    return model

main_input = C.input_variable(100)
embedding = cl.Embedding(32)(main_input)

conv1 = getconvmodel(2,256)(embedding)
conv2 = getconvmodel(3,256)(embedding)
conv3 = getconvmodel(4,256)(embedding)
conv4 = getconvmodel(5,256)(embedding)

merged = C.splice([conv1,conv2,conv3,conv4])  
person chrisbasoglu    schedule 25.05.2017

Или с Sequential() и лямбдой:

def getconvmodel(filter_length,nb_filter):
    return Sequential([
        cl.Convolution(filter_length, nb_filter, activation=C.relu)),
        lambda f: C.reduce_sum(f, axis=0),
        cl.Dropout()
    ])
person Frank Seide MSFT    schedule 26.05.2017