TF 2.0 последовательная CNN в LSTM для регрессии ошибки "Отрицательный размер"

Я пытаюсь построить модель, которая прогнозирует цену определенного товара на основе текущих рыночных условий, мои данные имеют форму, аналогичную

num_samples = 100
sample_dimension = 10
XXX = np.random.random((num_samples,sample_dimension)).reshape(-1,1,sample_dimension)
YYY = np.random.random(num_samples).reshape(-1,1)

Итак, у меня есть 100 упорядоченных выборок X данных, каждая из которых состоит из 10 переменных. Моя модель выглядит следующим образом

model = keras.Sequential()
model.add(tf.keras.layers.Conv1D(4,
                                 kernel_size = (2),
                                 activation='sigmoid',
                                 input_shape=(None, sample_dimension),
                                 batch_input_shape = [1,1,sample_dimension]))

model.add(tf.keras.layers.AveragePooling1D(pool_size=2))
model.add(tf.keras.layers.Reshape((1, sample_dimension)))
model.add(tf.keras.layers.LSTM(100,
                                    stateful = True,
                                    return_sequences=False,
                                    activation='sigmoid'))
model.add(keras.layers.Dense(1))

model.compile(optimizer='adam',
              loss='mean_squared_error',
              metrics=['accuracy'])

так что это 1D свертка, объединение, изменение формы (так что он хорошо работает с lstm), а затем переход к предсказанию

но когда я пытаюсь запустить его, я получаю следующую ошибку

Отрицательный размер измерения, вызванный вычитанием 2 из 1 для 'conv1d/conv1d' (op: 'Conv2D') с входными формами: [1,1,1,10], [1,2,10,4].

Я пробовал несколько разных значений для размера ядра, размера пула и batch_input_shape (мне нужно пакетировать свои входные данные, потому что мои фактические данные распределены по нескольким большим файлам, поэтому я хочу читать по одному и запускать его для обучения модель), но вроде ничего не работает.

Что я делаю неправильно? Как я могу отслеживать / прогнозировать форму моих данных при их прохождении через эту модель? Как должны выглядеть данные / переменные?

1 ответ

В итоге я просмотрел руководства по conv2D, а затем преобразовал все в conv1D (пожалуйста, отредактируйте, как считаете нужным)

conv2D решение

model = keras.Sequential()
model.add(tf.keras.layers.Conv2D(4,
                                 kernel_size = (**1**,2),
                                 activation = 'sigmoid',
                                 input_shape = (**1**,sample_dimension,1),
                                 batch_input_shape = [None,**1**,sample_dimension,1]))

model.add(tf.keras.layers.AveragePooling2D(pool_size=(1,2)))
#model.add(tf.keras.layers.Reshape((1,sample_dimension)))
model.add(tf.keras.layers.Flatten())
model.add(keras.layers.Dense(1))

Затем я преобразовал его в conv1D, взяв размерность из каждого из необходимых аргументов (жирным шрифтом 1 s)

model = keras.Sequential()
model.add(tf.keras.layers.Conv1D(4,
                                 kernel_size = 2,
                                 activation = 'sigmoid',
                                 input_shape = (sample_dimension,1),
                                 batch_input_shape = [None,sample_dimension,1]))

model.add(tf.keras.layers.AveragePooling1D(pool_size=2))
#model.add(tf.keras.layers.Reshape((1,sample_dimension)))
model.add(tf.keras.layers.Flatten())
model.add(keras.layers.Dense(1))

Я предполагаю, что ключевой вывод заключается в том, что тензорный поток не предназначен для работы с векторами или даже матрицами, поэтому последнее измерение должно быть размерностью тензора - в этом случае это одномерный тензор (просто число), хранящийся в sample_dimension

Другие вопросы по тегам