Ошибка с формой ввода в кератах - PullRequest
0 голосов
/ 24 марта 2020

Я использую Keras для создания CNN, и у меня есть следующий фрагмент кода:

model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(50,)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
#model.add(Dense(20, activation='relu'))
model.add(Dense(1, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(trainX, trainY, epochs=10, batch_size=32, verbose=0)

После выполнения этого я получаю следующую ошибку:

ValueError: Вход 0 несовместим со слоем conv1d_1: ожидаемый ndim = 3, найденный ndim = 2

enter image description here

Форма набора данных: enter image description here

Пожалуйста, помогите мне с ситуацией!

Спасибо

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Слои Conv ожидают, что ваш ввод будет тип изображения. Следовательно, вам нужно указать / изменить форму, чтобы включить измерение канала. В вашем случае ваше количество каналов составляет 1.

model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(50,1, )))

Тогда вам также необходимо соответственно изменить свой ввод. Он должен иметь форму (batchsize, num_features, channel)

Таким образом, предполагая, что ваш X представляет собой numpy массив

trainX = X[:30730].reshape(-1, 50, 1)
0 голосов
/ 24 марта 2020

У вас есть две основные проблемы с кодом, который вы отправили:

  1. Несогласованная форма ввода : ошибка говорит о том, что ваша модель ожидает ввода с dim=3, но Вы передаете это dim=2. Это верно, так как слой cov1d ожидает получить тензор 3d (#samples, #steps, #features). Ваши тренировочные данные имеют shape=(30730,50), поэтому #samples=30730, #steps=50 и #features=1. #samples передается неявно (определяется во время выполнения), поэтому исправьте следующие строки:

    model = Sequential()
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(50,)))
    

    в:

    model = Sequential()
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(50,1)))
    

    Кроме того, вы должны изменить данные тренировки соответственно, добавив размер:

    trainX = X[:30730].reshape(-1, 50, 1)
    
  2. Несоответствующая форма вывода : Ваша модель обучена с loss=categorical_crossentropy. Тренировка с такими потерями означает, что вы должны в одно мгновение закодировать свои данные тренировки. Поэтому, если у вас есть x классов, каждый пример из trainY необходимо преобразовать в массив с length=x. Но, , в вашем случае модель выдает один вывод: model.add(Dense(1, activation='softmax')), поэтому вы должны использовать loss=binary_crossentropy для задачи классификации `loss = mse ', например, для задачи регрессии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...