Вопрос или проблема
Я немного запутался в форме выходных данных, которую выдает Conv1D. Рассмотрим код, который я использовал (многое опущено для ясности):
input_shape = x_train_2trans.shape
# (7425, 24, 1)
model.add(Conv1D(filters=4, input_shape=input_shape[1:], kernel_size=(3), activation=LeakyReLU))
model.add(Dropout(0.2))
model.add(Dense(1))
Я пробовал 3 разных размера ядра: 3, 2 и 1, и выходные размеры составили:
(256, 2500, 12, 1), (256, 2500, 18, 1), (256, 2500, 24, 1) соответственно.
Что меня смущает, так это разница в 6 между каждым уменьшением размера ядра. Насколько я понимаю, для размера ядра 3, 12 должно было бы быть 21; тогда как 18 для размера ядра 2 должно быть 22, чтобы соответствовать размеру 24 с указанными размерами ядер.
Заранее спасибо.
Скорее всего, проблема в входных данных.
Вот игрушечный пример.
import numpy as np
from tensorflow.keras import layers
input = np.ones((100,24,1))
input_shape = input.shape
layer = layers.Conv1D(filters=4, input_shape=input_shape[1:], kernel_size=(2))# Ядро=2
out = layer(input)
out.shape
layer = layers.Conv1D(filters=4, input_shape=input_shape[1:], kernel_size=(4))# Ядро=4
out = layer(input)
out.shape
Выход –
TensorShape([100, 23, 4])
TensorShape([100, 21, 4])Последнее измерение связано с количеством фильтров, которое станет признаками для следующего слоя
Ответ или решение
Конечно! Давайте разберемся с выходной формой, которую вы получаете при использовании слоя Conv1D в вашей модели.
Понимание выходной формы Conv1D
При применении свертки с помощью слоя Conv1D, выходная форма вычисляется на основе нескольких параметров: формы входных данных, размера ядра (kernel size) и количества фильтров (filters).
Входные данные
Вы указали, что ваши входные данные имеют форму (7425, 24, 1)
, где:
- 7425 — это количество образцов (samples),
- 24 — длина временного ряда или размерность данных (например, количество признаков),
- 1 — количество каналов (например, для одномерных данных, таких как временные ряды, это может быть просто один канал).
Размер ядра
Ваша модель использует различные размеры ядра: (3), (2) и (1). Давайте поговорим о том, как эти изменения в размере ядра влияют на выходную форму.
Формула для вычисления выходной формы
Выходная форма Conv1D для входа размерности (batch_size, steps, input_dim)
может быть вычислена по следующей формуле:
[
\text{output_length} = \frac{\text{input_length} – \text{kernel_size}}{\text{stride}} + 1
]
При этом по умолчанию stride равен 1.
Таким образом, для вашего случая:
-
Размер ядра = 3:
[
\text{output_length} = \frac{24 – 3}{1} + 1 = 22
] -
Размер ядра = 2:
[
\text{output_length} = \frac{24 – 2}{1} + 1 = 23
] -
Размер ядра = 1:
[
\text{output_length} = \frac{24 – 1}{1} + 1 = 24
]
Каждый из этих расчетов показывает, что выходная длина должна уменьшаться в зависимости от размера ядра, что видно из ваших данных.
Причина расхождения в результатах
Вы описали, что получаете разные размеры выходных данных, не соответствующих ожиданиям, например, (256, 2500, 12, 1)
. Такое несоответствие может происходить из-за нескольких факторов:
-
Проблемы с данными: Убедитесь, что форма ваших входных данных соответствует ожидаемой. Например, если ваши данные имеют другой размер, чем указано, выход может изменяться.
-
Условия применения пустого падинга (padding): Возможно, в вашей модели используется параметр
padding
, например, ‘same’ или ‘valid’, который влияет на выходную форму. Еслиpadding='same'
, то выходная длина будет равна входной, и будет добавляться достаточно "пустого" пространства, чтобы сохранить форму. -
Количество фильтров (features): Количество фильтров может быть причиной, по которой вы видите изменения в третьем измерении выходных данных. Например, при
filters=4
, выход будет иметь размерность (batch_size, output_length, num_filters).
Заключение
Ваша путаница, вероятно, связана с тем, какие именно параметры (включая размер ядра и падинг) вы применили в разных версиях вашей модели. Сравните вашу реализацию с примерами, которые мы просмотрели выше, и убедитесь, что все размеры и параметры заданы корректно.
Если все параметры установлены правильно и вы все еще видите несоответствия, возможно, стоит проверить обрабатываемые данные и убедиться, что они имеют ту же размерность и форму, что и ожидается.