Последовательный CNN TF 2.0 в LSTM для ошибки регрессии "Размер отрицательного измерения" - PullRequest
1 голос
/ 25 октября 2019

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

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'])

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

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

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

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

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

1 Ответ

0 голосов
/ 27 октября 2019

В итоге я просмотрел учебники для 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 с)

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))

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

...