Вопрос или проблема
Я не уверен, почему я получаю эту ошибку значения. Кроме того, я не нашел учебного пособия, которое явно обсуждало бы уместность размера фильтров и ядра. Я был бы признателен за некоторые советы и ссылки. Я предсказываю следующий предпоследний или последний столбец.
Вот мой код:
import pandas as pd
import keras
from keras import Input, layers , Model
from sklearn.model_selection import train_test_split
from keras.layers import Dropout
input_tensor=Input(shape=(6,))
x= layers.Conv1D(filters=128,kernel_size=18, padding='same', activation='relu')(input_tensor)
#x=layers.MaxPooling1D(5)(x)
#x = Dropout(0.5)(x)
x= layers.Conv1D(256,5, activation='relu')(x)
#x = Dropout(0.4)(x)
#x= layers.Dense(4, activation='relu')(x)
#x = Dropout(0.2)(x)
x= layers.Conv1D(256,5, activation='relu')(x)
x=layers.MaxPooling1D(5)(x)
x = Dropout(0.3)(x)
#x= layers.Dense(16,1, activation='relu')(x)
callbacks_list=[
keras.callbacks.EarlyStopping(monitor="acc",
patience=3,),
keras.callbacks.ModelCheckpoint(
filepath="C:/Users/vtodorova/results3/APIFunctional.py",
monitor="accuracy",
save_best_only=True),
keras.callbacks.ReduceLROnPlateau(
factor=0.1, patience=10,)]
model.compile(optimizer="RMSprop", loss="mse", metrics=['accuracy'])
#callbacks=callbacks_list
model.fit(X1_train, y1_train, epochs=3, batch_size=256, verbose=1)
model.fit(X2_train, y2_train, epochs=3, batch_size=256, verbose=1)
score1=model.evaluate(X1_train, y1_train)
score2=model.evaluate(X2_train, y2_train)
output_tensor=layers.Dense(1)(x)
model=Model(input_tensor, output_tensor)
Вот заголовок данных. Имена столбцов и сами столбцы немного сместились, когда я копировал и вставлял, но я надеюсь, что это нормально.
AutoLeadID leadage leadstatustypeid hasCob hasSRE
0 695746319 5 1 0 0
1 695746320 5 1 0 0
2 695746321 5 1 0 0
3 695746322 5 1 0 0
4 695746323 5 1 0 0
hasSRC hasCRE hasCRPC
0 0 0 0
1 0 0 0
2 0 0 0
3 0 0 0
4 0 0 0
После выполнения вашего кода основная проблема заключается в том, что отсутствует правильное указание формы ввода.
В вашем случае вместо передачи shape=(6,) попробуйте передать shape=(6,1) и убедитесь, что ваши данные находятся в следующем формате.
x = [[695746319], [5], [1], [0], [0], [0], [0]]
Можете ли вы привести точную ошибку, не могу решить без этого!!
Есть 2 проблемы, первая ваша форма ввода должна быть
input_tensor=Input(shape=(6, 1))
так как возникала эта ошибка:
input 0 is incompatible with layer conv1d_31: expected ndim=3, found ndim=2
Решив это, я чувствую проблему с 3-м Conv1D, вот она
Ввод имеет форму 6, и с padding = same, выход составляет 6.
Вторая свертка имеет выходную форму 2 по формуле out_shape = (in_shape – kernel_size + 2*padding)/stride +1 (валидное дополнение)
3-я свертка имеет размер ядра 5 с формой ввода 2, что должно дать ошибку отрицательной формы. Это невозможно математически. Так что либо уменьшите размер ядра, либо уберите этот слой. Также вам нужно изменить уровень пула, так как он тоже выдаст ту же ошибку
Ответ или решение
Ошибка значения input_shape в модели Keras Conv1D: Подробный анализ и решения
В данной статье мы рассмотрим проблему, связанную с получением ошибки значения при использовании Conv1D в Keras, а также предложим решения, которые помогут вам правильно настроить входные данные и архитектуру вашей модели.
Описание проблемы
Вы столкнулись с ошибкой, связанной с несовпадением размерности входного тензора для слоя Conv1D. Приведенный вами код создает входной тензор с формой (6,)
, что на самом деле является двумерным массивом. Однако для слоя Conv1D требуется трехмерный ввод в формате (samples, timesteps, features)
.
Ошибка
Ошибка, которую вы получаете:
input 0 is incompatible with layer conv1d_31: expected ndim=3, found ndim=2
указывает на то, что входные данные не соответствуют ожидаемой размерности. Чтобы решить эту проблему, вам следует изменить форму входного тензора на (6, 1)
, что будет означать, что у вас 6 временных шагов и 1 признак.
Модификация входного тензора и данных
Вы должны изменить объявление вашего входного тензора следующим образом:
input_tensor = Input(shape=(6, 1)) # Измените форму
Кроме того, ваши данные должны быть представлены в следующем формате:
x = [[[695746319], [5], [1], [0], [0], [0]], # 1 образец с 6 временными шагами и 1 признаком
...]
Каждый образец должен быть представлен как трехмерный массив, где samples
— это количество наблюдений, timesteps
— это временные шаги, а features
— количество признаков.
Проблемы с Conv1D и корректировка архитектуры
После решения проблемы с входной размерностью, возможно, возникнут дополнительные ошибки, связанные с размером ядра и пуллинга. Рассмотрим структуру вашего кода:
-
Первый слой Conv1D: Вы используете
kernel_size=18
, что не сможет обработать входные данные с размером(6, 1)
, так как размер ядра превышает количество временных шагов. Это приведет к следующей ошибке:The shape of the output is smaller than the kernel size.
Решение: Уменьшите размер ядра до 6 или 4.
-
Второй и третий слои Conv1D: После каждого применения сверточного слоя размерность данных уменьшается. Убедитесь, что вы используете правильные ядра и не превышаете возможные размеры при следующих свертках.
-
MaxPooling: Пуллинг также повлияет на размерность данных. Убедитесь, что размер пулинга не превышает размер текущей ширины.
Рекомендуемая архитектура
Вот пример измененного кода с корректировками:
import pandas as pd
import keras
from keras import Input, layers, Model
from sklearn.model_selection import train_test_split
from keras.layers import Dropout
# Измените форму входного тензора
input_tensor = Input(shape=(6, 1))
# Смените kernel_size на меньшее значение
x = layers.Conv1D(filters=128, kernel_size=4, padding='same', activation='relu')(input_tensor)
x = layers.MaxPooling1D(2)(x) # Пуллинг уменьшит размерность
x = layers.Conv1D(256, 4, activation='relu')(x)
x = layers.MaxPooling1D(2)(x)
# Убедитесь, что размер входа для следующего слоя соответствующий
x = Dropout(0.3)(x)
output_tensor = layers.Dense(1)(x)
model = Model(input_tensor, output_tensor)
Заключение
Из данного анализа становится понятно, что правильная настройка входных данных и архитектуры модели критически важна для успешной работы с Keras Conv1D. Убедитесь, что вы изменили форму входных данных, уменьшили размер ядра и адаптировали структуру модели под размеры, которые сможете обработать.
Если вам нужны дальнейшие книги или ссылки для изучения, вот несколько ресурсов:
Надеюсь, это поможет вам успешно устранить возникшие проблемы и продвинуться в ваших проектах!