Как установить размеры для 1D сверточных сетей? - PullRequest
0 голосов
/ 27 сентября 2018

У меня 2к наблюдений.Каждое наблюдение имеет 2 канала, и каждый канал представляет собой вектор 1D 1024.

Observation_dim = (2000,2,1024)

Структура:

channe1 (1,1024)----> Convolutional layer1---
                                              \
                                               > concatenate-->FCN-->binary_classification     
                                              /   
channe2 (1,1024)----> Convolutional layer2---                                              

Каждый канал содержит независимую информацию, поэтому свертка должна выполняться 1D и отдельнодля каждого канала.

Это двоичная классификация, поэтому каждое наблюдение может принадлежать к классу 0 или 1.

Проблема: Я не знаю, как установить измерениядля простой классификации):

Примечание: Я пытаюсь извлечь элементы из каждого канала отдельно, используя функцию conv_1d, затем объединить сглаженный вывод каждого conv_1d и вставить вFCN.

def conv_1d(x):
    w_s=3
    p_s=4
    conv1 = Conv1D(32, w_s, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(x)
    batch1 = BatchNormalization()(conv1)
    pool1 = MaxPooling1D(pool_size=p_s)(batch1)

    conv2 = Conv1D(64, w_s, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1)
    batch2 = BatchNormalization()(conv2)
    pool2 = MaxPooling1D(pool_size=p_s)(batch2)

    flat = Flatten()(pool2)
    return flat

def tst_1():
    model = Sequential()
    inputs = Input((2, 1024,1))#(batch, height, width, channels)

    x1 = Lambda(lambda x:x[:,0])(inputs)
    dense12= conv_1d(x1)

    x2 = Lambda(lambda x:x[:,1])(inputs)
    dense22 = conv_1d(x2)


    flat = keras.layers.Concatenate()([dense12, dense22])

    dense1 = Dense(512, activation='relu')(flat)
    BN1 = BatchNormalization()(dense1)
    dense2 = Dense(256, activation='relu')(BN1)
    drop2 = Dropout(0.5)(dense2)
    dense3 = Dense(64, activation='relu')(drop2)
    densef = Dense(1, activation='sigmoid')(dense3)

    model = Model(inputs = inputs, outputs = densef)

    model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])


    return model

model = tst_1()
model.summary()

1 Ответ

0 голосов
/ 29 сентября 2018

Я наконец смог решить эту проблему с помощью функционального API Keras (не обычным последовательным способом), и вот результат:

inputs = Input((2, 1000,1))#(batch, height, width, channels)

# first feature extractor
x1 = Lambda(lambda x:x[:,0])(inputs)
conv1 = Conv1D(32, kernel_size=4, activation='relu')(x1)
pool1 = MaxPooling1D(pool_size=2)(conv1)
flat1 = Flatten()(pool1)
# second feature extractor
x2 = Lambda(lambda x:x[:,1])(inputs)
conv2 = Conv1D(32, kernel_size=4, activation='relu')(x2)
pool2 = MaxPooling1D(pool_size=2)(conv2)
flat2 = Flatten()(pool2)
# merge feature extractors
merge = concatenate([flat1, flat2])
# interpretation layer
hidden1 = Dense(10, activation='relu')(merge)
# prediction output
output = Dense(1, activation='sigmoid')(hidden1)
model = Model(inputs=inputs, outputs=output)
# summarize layers
print(model.summary())

, и сеть будет выглядеть следующим образом: введите описание изображенияздесь

Подробную информацию об использовании Keras API вы можете найти здесь: введите описание ссылки здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...