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