Что является вторым параметром в 1DConv форме вывода keras Сводка модели? - PullRequest
0 голосов
/ 13 марта 2020

Я обучаю модель 1DConv, имеющую 4248 экземпляров и 39249 функций в каждом экземпляре. Я пытаюсь модель VGG16 с 32 размера пакета, но после 7 слоев он возвращает следующую ошибку:

Отрицательный размер измерения, вызванный вычитанием 3 из 1 для conv1d_8 / convolution / Conv2D (op: 'Conv2D') с вводом формы: [?, 1,1256], [1,3255612].

Для дальнейшей отладки я напечатал всю сеть, используя keras model.summary (). Изображение прилагается. У меня есть две проблемы.

  1. Почему я получаю ошибку отрицательного размера?
  2. Я видел, что второй параметр в выходной форме переходит в 2 в слое conv1d_7, и дальнейшее вычитание не возможный. Что такое второй параметр? Я просмотрел этот документ и обнаружил, что второй параметр получен с использованием следующей формулы (высота-размер ядра + 1) и представляет количество шагов, по которым окно будет скользить по данным. Размер ядра в моем случае равен 3, и я не совсем понимаю рост. В документе объясняется, что «высота - это длина одного набора данных, который подается в сеть». Относится ли длина к количеству входных элементов или размеру пакета * к числу входных элементов? Как рассчитывается 11250 в выходной форме первого слоя. Ниже приведен мой код (я могу рассчитать параметры для остальной части слоя, только второй параметр сбивает с толку, предыдущие посты объясняют, как рассчитать параметры, а не о длине данных).
  3. Для таких огромных возможностей ( 39249) на выборку и только около 4 тыс. Экземпляров, какой алгоритм глубокого обучения может быть полезен для точной классификации?

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

model = Sequential()
 model.add(Conv1D(filters = 8, kernel_size=3, strides=3, activation='relu', input_shape=(n_timestamps,n_features)))

 model.add(Conv1D(filters=16, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))

 model.add(Conv1D(filters=32, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))

 model.add(Conv1D(filters=64, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))
 model.add(Conv1D(filters=64, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))

 model.add(Conv1D(filters=128, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=128, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=4,strides=3))
 print(model.summary())

 model.add(Conv1D(filters=256, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=256, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=256, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))
 print(model.summary())

 model.add(Conv1D(filters=512, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=512, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=512, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))
 print(model.summary())

 model.add(Conv1D(filters=512, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=512, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=512, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))

 model.add(Flatten())
 model.add(Dense(4096, activation='relu'))
 #model.add(Dropout(0.5))
 model.add(Dense(4096, activation='relu'))
 #model.add(Dropout(0.5))
 model.add(Dense(n_outputs, activation='softmax'))
 print(model.summary())

enter image description here

Ответы [ 2 ]

1 голос
/ 16 марта 2020

1) Любая операция, которая уменьшает вашу выходную карту объектов, будет причиной ошибки отрицательного измерения. Обычно это происходит из-за «действительного» заполнения, объединения или шагов.

«VALID» = без заполнения:

   inputs:         1  2  3  4  5  6  7  8  9  10 11 (12 13)
                  |________________|                dropped
                                 |_________________|

«POOLING» = 2x2 max-pooling, только 1 максимальное значение из окна 2by2, поэтому выходная форма уменьшается вдвое при каждом применении.

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

2) Вы использовали большое значение шага, поэтому длина вашей карты объектов уменьшается Быстрее. Вы можете следить за любым блогом, чтобы получить представление о том, как рассчитать каждый параметр: https://towardsdatascience.com/understanding-and-calculating-the-number-of-parameters-in-convolution-neural-networks-cnns-fc88790d530d

3) Вы можете просто уменьшить количество нейронов в вашем плотном или F C слоях , Попробуйте с меньшими единицами, такими как 512 вместо 4096 и посмотрите, как падает точность. Добавьте несколько нормальных слоев и увеличьте выпадение, чтобы не происходило переоснащение.

1 голос
/ 14 марта 2020

1 - Здесь у нас проблема с шагом = 3 в каждом слое. это означает, что после каждого фильтра свертки перо-размер изменяется на перо-размер / 3, и это приводит к быстрому уменьшению размера пера. Я предлагаю вам уменьшить шаг фильтров. например, шаг = 1 кажется подходящим.

2-Как общая формула, вы можете рассчитать размер выходного пера после каждой конв. фильтр по ((feather_size - kernel_size) / stride) + 1

В конце, для более подробного описания каждого параметра в сверточном фильтре в кератах, я могу отослать вас к https://keras.io/layers/convolutional/

...