Ошибка значения в сверточной нейронной сети из-за формы данных

Я пытаюсь предсказать количество пиков в данных временных рядов с помощью CNN и продолжаю получать ошибку формы данных. Мои данные выглядят следующим образом:

  • X = список из 520 списков (каждый представляет собой временной ряд) различной длины (самый короткий = 137 элементов, самый длинный = 2297 элементов)
  • y = список из 520 элементов, каждый из которых представляет собой количество пиков для соответствующего временного ряда

Из-за разной длины временных рядов я добавил X. Формы X_train и X_test после преобразования их из пустых массивов в тензоры:

  • X_train.shape = TensorShape([390, 2297])
  • X_test.shape = TensorShape([130, 2297])

Я новичок в keras и очень не уверен в input_size в первом слое Conv1D. Согласно этому сообщению (Ожидаемая входная форма Keras/Tensorflow Conv1D) я выбрал его как (2297, 1) или (520, 1), но ни один из них не работает. В документации Keras сказано, что форма ввода должна быть (batch_size, feature_size, channels), хотя batch_size опущена.

from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import *
from tensorflow.keras.optimizers import Adam

#for structure of X and y, see explanation above

X_padded = tf.keras.preprocessing.sequence.pad_sequences(X)

X_train, X_test, y_train, y_test = train_test_split(X_padded, y, test_size=0.25, random_state=33)


X_train = tf.convert_to_tensor(X_train)
X_test = tf.convert_to_tensor(X_test)
y_train = tf.convert_to_tensor(y_train)
y_test = tf.convert_to_tensor(y_test)

model = keras.Sequential()
model.add(Conv1D(filters=16, kernel_size=3, activation = 'relu', strides = 1, padding = 'same', input_shape=(2297, 1)))
model.add(Dropout(0.1))
model.add(Conv1D(filters=32, kernel_size=3, activation = 'relu', strides = 1, padding = 'same'))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(9, activation='softmax')) # '9' because there are 9 possible peak counts in the data

model.compile(optimizer=Adam(learning_rate = 0.001), loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])

progress = model.fit(X_train, y_train, epochs = 15, validation_data = (X_test, y_test), verbose=1)

Ошибка:

 ValueError: Input 0 of layer sequential is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 2297]

В чем тут может быть дело?

попробуйте изучить эту функцию: numpy.org/doc/stable/reference/generated/numpy.expand_dims.h‌​tml

Olasimbo Arigbabu 06.05.2022 22:22

@olahsymbo спасибо, я сделал X_train = np.expand_dims(X_train, axis=0) и сделал то же самое для X_test, y_train и y_test. Это вызывает ValueError: ввод 0 последовательного слоя несовместим со слоем: ожидаемая ось -1 входной формы имеет значение 1, но полученный ввод с формой [Нет, 390, 2297]

lonyen11 06.05.2022 22:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я смог решить это. Правильная форма ввода указана здесь Входная форма сверточной нейронной сети Conv1d в ответе пользователя 'rnso'.

Я сформировал свои X_train и X_test (будучи numpy.arrays) как

X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)

и указал input_shape в заявлении Conv1D как input_shape=(ncols, 1)

input_shape=(2297, 1)

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