Ошибка формы вывода сверточной нейронной сети в керасе - PullRequest
0 голосов
/ 04 октября 2019

Я работал над простой сверточной моделью нейронной сети, но результат, похоже, не соответствует желаемой форме.


from keras.layers import Input, Conv2D, MaxPooling2D, Reshape, Flatten, Dense, Dropout, Activation
from keras.models import Sequential
from keras.layers.convolutional import *
from keras.layers.pooling import *
from keras.optimizers import Adam
from keras.optimizers import rmsprop
from keras.metrics import categorical_crossentropy

model_CL = Sequential([
    Dense(64, activation = 'relu', input_shape = (200, 4, 1)),
    Conv2D(64, kernel_size = (3, 3), activation = 'relu', padding = 'same'),
    MaxPooling2D(pool_size = (2, 2), strides = 2, padding = 'valid'),
    Dropout(rate=0.3),
    Conv2D(64, kernel_size = (5, 5), activation = 'relu', padding = 'same'),
    Flatten(),
    Dense(2, activation = 'softmax')
])




model_CL.compile(loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'], optimizer = 'Adam')
model_CL.summary()


from keras.callbacks import EarlyStopping
from keras.callbacks import ModelCheckpoint

es_CL = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=5)
mc_CL = ModelCheckpoint('best_model_CL.h5', monitor='val_acc', mode='max', verbose=1, save_best_only=True)

epochs = 50
hist_CL = model_CL.fit(CL_train_input, CL_train_label, validation_data=(CL_validation_input, CL_validation_label), batch_size=32, epochs=epochs, verbose=0, callbacks=[es_CL, mc_CL])

Таким образом, мой размер ввода не соответствуетпроблема. Форма ввода моего тренировочного набора (13630, 200, 4, 1), где 13630 - это количество данных, в то время как мой training_label выглядит следующим образом. (13630, 2) Я ожидал, что форма вывода модели будет (2,), но вместо этого кажется, что она ожидает (1,) в качестве размера вывода.

Так что моя ошибка выглядит следующим образом.

Ошибка при проверке целевого объекта: ожидалось, что плотность_2 будет иметь форму (1,), но получен массив с формой (2,)

только для справки,

Модель: "sequential_14"


Слой (тип) Выходной параметр Параметр #

density_27 (Плотный) (Нет, 200, 4, 64) 128


conv2d_27 (Conv2D) (Нет, 200, 4, 64) 36928


max_pooling2d_14 (MaxPooling (Нет, 100, 2, 64) 0


dropout_14 (Выпадение) (Нет, 100, 2, 64) 0


conv2d_28 (Conv2D) (None, 100, 2, 64) 102464


flatten_13 (Flatten) (None, 12800) 0


dens_28 (Плотный) (Нет, 2) 25602

Всего параметров: 165,122 Обучаемые параметры: 165,122 Необучаемые параметры: 0

Вот краткий обзор моей модели. Я не слишком уверен, почему он ожидает (1,).

1 Ответ

1 голос
/ 04 октября 2019

Проблема здесь в том, что вы берете 2 в качестве вывода, а вы вводите только 1 на входном слое. Вот что вы можете сделать:

  • В этом выходном слое Dense(2, activation = 'softmax') вы можете изменить первый аргумент на 1, что означает, что вы берете один выход для двоичной задачи. Например, Dense(1, activation = 'softmax').
  • Еще одна вещь, которую вы можете сделать, это то, что вы можете выбрать другую функцию потерь, такую ​​как binary_crossentorpy, а затем вы можете конвертировать ваши метки, используя to_categorical(), которая является функцией утилит keras. CL_train_labels = to_categorical(CL_train_labels) Надеюсь, это поможет.
...