Как соединить вышки Keras Conv1D в начальном модуле? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть данные 18 функций и 2 классов.У меня есть рабочая сверточная сеть Keras для этих данных, и она отлично работает.Сейчас я пытаюсь настроить сеть начального модуля на те же данные.Когда я пытаюсь сделать это, на этапе объединения что-то идет не так.

Я попытался объединить башни из слоев Conv1D, как я делал для слоев Conv2D, но это не сработало.

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

model = Sequential()
model.add(Conv1D(32, (5), strides = (1), input_shape = (18, 1), activation = 'tanh'))
model.add(MaxPooling1D(pool_size = (2), strides = (2)))
model.add(Conv1D(32, (3), strides = (1), input_shape = (18, 1), activation = 'tanh'))
model.add(Flatten())
model.add(Dense(300,                                            activation = 'tanh'))
model.add(Dense(300,                                            activation = 'tanh'))
model.add(Dropout(rate = 0.5))
model.add(Dense(num_classes,                                    activation = 'softmax', name = "preds"))
model.compile(loss = "categorical_crossentropy", optimizer = "nadam", metrics = ['accuracy'])

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

inputs  = Input((18, 1))
tower_1 = MaxPooling1D(pool_size=(3), strides=(2), padding='same')(inputs)
tower_1 = Conv1D(32, (1), activation='tanh', border_mode='same')(tower_1)
tower_2 = Conv1D(32, (1), activation='tanh', border_mode='same')(inputs)
tower_2 = Conv1D(32, (3), activation='tanh', border_mode='same')(tower_2)
tower_3 = Conv1D(32, (1), activation='tanh', border_mode='same')(inputs)
tower_3 = Conv1D(32, (5), activation='tanh', border_mode='same')(tower_3)
x       = concatenate([tower_1, tower_2, tower_3], axis=3)
x       = Flatten()(x)
x       = Dense(50, activation='tanh')(x)
preds   = Dense(num_classes, activation='softmax', name='preds')(x)
model   = Model(input=inputs, output=preds)
model.compile(loss='categorical_crossentropy', optimizer='nadam', metrics  =['accuracy'])

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

---------------------------------------------------------------------------
    IndexError                                Traceback (most recent call last)
    <ipython-input-22-1dbf3d2822ae> in <module>()
          6 tower_3 = Conv1D(32, (1), activation='tanh', border_mode='same')(inputs)
          7 tower_3 = Conv1D(32, (5), activation='tanh', border_mode='same')(tower_3)
    ----> 8 x       = concatenate([tower_1, tower_2, tower_3], axis=3)
          9 x       = Flatten()(x)
         10 #x       = Dense(50, activation='tanh')(x)

    /usr/local/lib/python3.6/dist-packages/keras/layers/merge.py in concatenate(inputs, axis, **kwargs)
        639         A tensor, the concatenation of the inputs alongside axis `axis`.
        640     """
    --> 641     return Concatenate(axis=axis, **kwargs)(inputs)
        642 
        643 

    /usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py in __call__(self, inputs, **kwargs)
        429                                          'You can build it manually via: '
        430                                          '`layer.build(batch_input_shape)`')
    --> 431                 self.build(unpack_singleton(input_shapes))
        432                 self.built = True
        433 

    /usr/local/lib/python3.6/dist-packages/keras/layers/merge.py in build(self, input_shape)
        346         shape_set = set()
        347         for i in range(len(reduced_inputs_shapes)):
    --> 348             del reduced_inputs_shapes[i][self.axis]
        349             shape_set.add(tuple(reduced_inputs_shapes[i]))
        350         if len(shape_set) > 1:

    IndexError: list assignment index out of range

Друзья, товарищи, вы можете подсказать мне, почему это может происходить и как это можно исправить?

1 Ответ

0 голосов
/ 18 июня 2019

Для Conv1D обычные формы ввода и вывода имеют формат (batch_dim, width, channels), поэтому слияние с axis=3 выходит за пределы, это будет значение, которое вы используете с Conv2D, который имеет 4-мерные входы и выходы.

Итак, простое решение - использовать axis=2 здесь:

x       = concatenate([tower_1, tower_2, tower_3], axis=2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...