Я обучаю модель 1DConv, имеющую 4248 экземпляров и 39249 функций в каждом экземпляре. Я пытаюсь модель VGG16 с 32 размера пакета, но после 7 слоев он возвращает следующую ошибку:
Отрицательный размер измерения, вызванный вычитанием 3 из 1 для conv1d_8 / convolution / Conv2D (op: 'Conv2D') с вводом формы: [?, 1,1256], [1,3255612].
Для дальнейшей отладки я напечатал всю сеть, используя keras model.summary (). Изображение прилагается. У меня есть две проблемы.
- Почему я получаю ошибку отрицательного размера?
- Я видел, что второй параметр в выходной форме переходит в 2 в слое conv1d_7, и дальнейшее вычитание не возможный. Что такое второй параметр? Я просмотрел этот документ и обнаружил, что второй параметр получен с использованием следующей формулы (высота-размер ядра + 1) и представляет количество шагов, по которым окно будет скользить по данным. Размер ядра в моем случае равен 3, и я не совсем понимаю рост. В документе объясняется, что «высота - это длина одного набора данных, который подается в сеть». Относится ли длина к количеству входных элементов или размеру пакета * к числу входных элементов? Как рассчитывается 11250 в выходной форме первого слоя. Ниже приведен мой код (я могу рассчитать параметры для остальной части слоя, только второй параметр сбивает с толку, предыдущие посты объясняют, как рассчитать параметры, а не о длине данных).
- Для таких огромных возможностей ( 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())