Keras - cnn с несколькими входными фильтрами - PullRequest
0 голосов
/ 26 апреля 2020

Я экспериментирую с керасом и пытаюсь осуществить глубокое обучение, чтобы предсказать оценку упражнений пациентов. Тем не менее, я застрял на долгое время, пытаясь настроить сеть с помощью собственного генератора. Намерение: Допустим, у нас есть пациенты, приезжающие на обследование. Каждый пациент должен сделать 9 упражнений, в то время как он (она) захвачен камерой. Вход для нас представляет собой последовательность из 21 точки (3 димса каждый) во времени. С другим столбцом для метки времени это означает таблицу из 64 (21 * 3 + 1) столбцов. Каждый временной шаг представлен строкой значений в таблице. Таким образом, каждый пациент представлен девятью таблицами. Таким образом, net, который я пытаюсь реализовать, должен взять девять таблиц переменной длины в качестве входных данных и вывести оценку пациента, которая представляет собой одно число. Я следовал нескольким руководствам и в итоге получил следующее:

def get_base_model(input_len, fsize, width):
    input_seq = tf.keras.layers.Input(shape=(input_len, width))

    nb_filters = 10

    convolved = tf.keras.layers.Conv1D(
        nb_filters,
        fsize,
        padding="same",
        activation="tanh"
    )(input_seq)
    processed = tf.keras.layers.GlobalMaxPooling1D()(convolved)

    compressed = tf.keras.layers.Dense(50, activation="tanh")(processed)
    compressed = tf.keras.layers.Dropout(0.3)(compressed)
    model = tf.keras.models.Model(inputs=input_seq, outputs=compressed)

    return model

def main_model(inputs_lens, fsizes=[8, 16, 24]):
    width = Misc.COUNT_OF_POINTS * 3 + 1

    inputs = []
    for i in range(Misc.COUNT_OF_EXERCISES):
        inputs.append(tf.keras.layers.Input(shape=(inputs_lens[i], width)))

    base_nets = []
    for i in range(Misc.COUNT_OF_EXERCISES):
        # TODO down-sampling?
        base_nets.append(get_base_model(inputs_lens[i], fsizes[0], width))

    embeddings = []
    for i in range(Misc.COUNT_OF_EXERCISES):
        embeddings.append(base_nets[i](inputs[i]))

    merged = tf.keras.layers.Concatenate()(embeddings)
    out = tf.keras.layers.Dense(1, activation='sigmoid')(merged)
    model = tf.keras.models.Model(inputs=inputs, outputs=out)

    return model

И позже я использую его следующим образом.

        n_outputs = 1
        n_epochs = 10
        batch_size = 1

        inputs_lens = []
        for i in range(Misc.COUNT_OF_EXERCISES):
            inputs_lens.append(patients.get_max_row_count()) // TODO

        net = main_model(inputs_lens)
        net.compile(optimizer='rmsprop', loss='mse', metrics=['accuracy'])

        generator = Generator(patients)

        net.fit(
            generator,
            epochs=n_epochs,
            steps_per_epoch=generator.__len__(),
            verbose=2)

Проблема: Насколько я знаете, мне нужно заполнить net кортежами (x, y), где y - пакет результатов - массив чисел оценки, а x - пакет входов - массив формы batch_size * упражнение_count * timesteps * ценности. Я также подготовил генератор, предоставив пакеты:

print (generator. getitem (0) [0] .shape) // (32, 9, 678, 64) -> (batch_size, упражнения, шаги, значения) print (генератор. getitem (0) [1] .shape) // (32,) -> (batch_size,).

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

ValueError: Вход 0 слоя conv1d несовместим со слоем: ожидаемый ndim = 3, найденный ndim = 4. Получена полная форма: [Нет, Нет, Нет, Нет]

вместе с предупреждениями:

ВНИМАНИЕ: тензор потока: Модель построена с формой (Нет, 678, 64 ) для входного Tensor («input_1: 0», shape = (None, 678, 64), dtype = float32), но он был вызван на входе с несовместимой формой (None, None, None, None). ВНИМАНИЕ: тензор потока: модель была построена с формой (None, 678, 64) для входного Tensor («input_10: 0», shape = (None, 678, 64), dtype = float32), но она была вызвана на входе с несовместимым форма (Нет, Нет, Нет, Нет).

Net Сводка:

Печать (net .summary ())

Model: "model_9"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            [(None, 678, 64)]    0                                            
__________________________________________________________________________________________________
input_2 (InputLayer)            [(None, 678, 64)]    0                                            
__________________________________________________________________________________________________
input_3 (InputLayer)            [(None, 678, 64)]    0                                            
__________________________________________________________________________________________________
input_4 (InputLayer)            [(None, 678, 64)]    0                                            
__________________________________________________________________________________________________
input_5 (InputLayer)            [(None, 678, 64)]    0                                            
__________________________________________________________________________________________________
input_6 (InputLayer)            [(None, 678, 64)]    0                                            
__________________________________________________________________________________________________
input_7 (InputLayer)            [(None, 678, 64)]    0                                            
__________________________________________________________________________________________________
input_8 (InputLayer)            [(None, 678, 64)]    0                                            
__________________________________________________________________________________________________
input_9 (InputLayer)            [(None, 678, 64)]    0                                            
__________________________________________________________________________________________________
model (Model)                   (None, 50)           5680        input_1[0][0]                    
__________________________________________________________________________________________________
model_1 (Model)                 (None, 50)           5680        input_2[0][0]                    
__________________________________________________________________________________________________
model_2 (Model)                 (None, 50)           5680        input_3[0][0]                    
__________________________________________________________________________________________________
model_3 (Model)                 (None, 50)           5680        input_4[0][0]                    
__________________________________________________________________________________________________
model_4 (Model)                 (None, 50)           5680        input_5[0][0]                    
__________________________________________________________________________________________________
model_5 (Model)                 (None, 50)           5680        input_6[0][0]                    
__________________________________________________________________________________________________
model_6 (Model)                 (None, 50)           5680        input_7[0][0]                    
__________________________________________________________________________________________________
model_7 (Model)                 (None, 50)           5680        input_8[0][0]                    
__________________________________________________________________________________________________
model_8 (Model)                 (None, 50)           5680        input_9[0][0]                    
__________________________________________________________________________________________________
concatenate (Concatenate)       (None, 450)          0           model[1][0]                      
                                                                 model_1[1][0]                    
                                                                 model_2[1][0]                    
                                                                 model_3[1][0]                    
                                                                 model_4[1][0]                    
                                                                 model_5[1][0]                    
                                                                 model_6[1][0]                    
                                                                 model_7[1][0]                    
                                                                 model_8[1][0]                    
__________________________________________________________________________________________________
dense_9 (Dense)                 (None, 1)            451         concatenate[0][0]                
==================================================================================================
Total params: 51,571
Trainable params: 51,571
Non-trainable params: 0
__________________________________________________________________________________________________

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 26 апреля 2020

Я более знаком с фреймворком pytorch для нейронных сетей, но я думаю, что базовый c layer logi c определяется таким же образом. Я считаю, что проблема, с которой вы сталкиваетесь, заключается в использовании Conv1D. Слои конвоя не очень интуитивны, но они разбиваются следующим образом:

  • Conv1D ожидает ввода [batch_size, n_feat_vecs, feat_vec_idx]. Он используется для свертывания (одномерное ядро) вдоль одномерных векторов объектов, и у вас есть n_feat_vecs для каждого элемента в вашем пакете. Таким образом, ваш ввод является трехмерным .
  • . Conv2D ожидает ввода [batch_size, n_feat_maps, feat_map_row, feat_map_column]. Он используется для свертывания (2D-ядро) вдоль 2D-карт объектов, и у вас есть n_feat_maps этих 2D-карт объектов для каждого элемента в вашем пакете. Таким образом, вход является 4-мерным.

Теперь в вашем случае ваш вход в настоящее время 4-мерный, поэтому этот вход несовместим с Conv-1D. У вас есть две возможности справиться с этим:

  • Использовать Conv2D - для этого не потребуется никакого переформатирования ввода, но вам придется использовать операцию преобразования после форматирования слоев Conv результат в форму, которую могут принять плотные слои. Использование двумерной свертки приведет к свертке ядра по нескольким значениям для одного отдельного временного шага и временным шагам. Если у вас есть основания полагать, что временная взаимосвязь между временными шагами содержит полезную информацию, которую можно использовать при сверточности ядра, это путь к go.
  • Использование Conv1D - альтернативно, вы можете решите, что вы не хотите сворачивать двумерное ядро ​​по временным шагам и значениям одновременно. В этом случае вам необходимо сгладить входной вектор 4D в 3 измерениях, возможно, путем объединения всех значений для всех временных шагов по одному измерению. Это предотвратит изучение моделью некоторого ядра временной корреляции между временными шагами, обрабатывая различные временные шаги отдельно. Операция выравнивания должна быть чем-то вроде inputs.reshape(batch_size,n_exercises,-1).

. Вы можете решить, какой из них будет более полезным и, вероятно, более информативным для вашей конкретной задачи. Надеюсь, это поможет!

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