Вопрос или проблема
Создание модели:
model=Sequential()
model.add(Dense(input_dim = 12, units = 10, activation='relu', kernel_initializer="uniform"))
model.add(Dense(units = 8, activation='relu', kernel_initializer="uniform"))
model.add(Dense(units = 1, activation='sigmoid', kernel_initializer="uniform"))
print('Обучение модели...')
Компиляция модели:
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=['accuracy'])
выполняя model.fit()
Настройка модели:
model.fit(X_train, y_train, batch_size=32, epochs=10, verbose=1)
Я получаю ошибку:
ValueError: Ошибка при проверке входных данных: ожидаемый dense_36_input имеет форму
(None, 12), но получен массив с формой (140, 2)
Размерность входа означает количество признаков или столбцов, которые ваши входные данные должны иметь.
Нейронная сеть попытается адаптироваться к этой форме входа. В вашем случае вы указали input_dim = 12
, но в ваших данных (140,2) всего 2 признака или столбца.
Таким образом, есть два варианта:
-
Установите
input_dim = 2
-
Измените форму входного массива на кратные указанной размерности входа, т.е. 12.
В вашем случае РАБОТАЕТ ТОЛЬКО вариант 1, потому что (140,2) не может быть изменен на кратные 12.
Примечание: другие допустимые input_dim
для вас могут быть 14 (измените входные данные на (20,14)), 10 (измените входные данные на (28,10))
Ответ или решение
Ошибка, с которой вы столкнулись, связана с несоответствием формы входных данных, ожидаемых вашей нейронной сетью, и фактической формой данных, которые вы предоставляете. Давайте разберем это более подробно.
Вы создали модель, в которой указали input_dim = 12
, что означает, что модель ожидает на вход данные с 12 признаками (колонками). Однако ваши входные данные имеют размерность (140, 2), что означает, что у вас только 2 признака, а не 12.
Возможные решения проблемы
Для решения данной проблемы у вас есть два основных варианта:
-
Изменить
input_dim
на 2:
Если ваши данные содержат только 2 признака (колонки), вы можете изменить параметрinput_dim
в первом слое вашей модели:model.add(Dense(input_dim=2, units=10, activation='relu', kernel_initializer="uniform"))
Это самый простой и логичный вариант, так как он напрямую соответствует вашей текущей структуре данных.
-
Изменить форму входных данных:
Другим вариантом является изменение ваших входных данных так, чтобы они соответствовали нужному количеству признаков. Однако в вашем случае, с формой данных (140, 2), это может не быть практичным, так как размерность данных не позволяет просто так изменить ее на 12.Если бы вы имели, например, 280 образцов и желали бы преобразовать ваши данные в (20, 14), вы могли бы так сделать. В вашем случае, когда у вас всего 140 образцов и 2 признака, это невозможно.
Рекомендации
- Вероятно, наиболее подходящим решением для вашей задачи является изменение
input_dim
на 2, если вы не планируете добавлять больше признаков в ваши данные. - Также стоит отметить, что если вы хотите использовать другие размеры входных данных, вам нужно будет дополнительно изменить данные так, чтобы они образовывали требуемые формы. Это может потребовать дополнительных манипуляций с данными, таких как дублирование признаков или создание новых, если это возможно и уместно.
Таким образом, рекомендуется изменить код следующим образом:
model.add(Dense(input_dim=2, units=10, activation='relu', kernel_initializer="uniform"))
После этого попробуйте снова запустить model.fit()
, и ошибка должна исчезнуть.