ValueError: Ошибка при проверке ввода: ожидалось, что conv1d_81_input будет иметь форму (177, 100), но получил массив с формой (1, 177) - PullRequest
0 голосов
/ 17 марта 2019

У меня есть эта ошибка в моем коде, кто-нибудь может мне помочь ??Как исправить входной массив, чтобы он соответствовал входной форме?

Мои данные: {Исходный набор данных из справочника состоит из 5 разных папок, каждая из которых содержит 100 файлов, причем каждый файл представляет отдельную тему / человека.Каждый файл представляет собой запись активности мозга за 23,6 секунды.Соответствующий временной ряд выбирается в 4097 точках данных.Каждая точка данных - это значение записи ЭЭГ в разные моменты времени.Таким образом, у нас есть 500 человек, каждый из которых имеет 4097 точек данных в течение 23,5 секунд.

Мы разделили и перетасовали каждые 4097 точек данных на 23 блока, каждый блок содержит 178 точек данных в течение 1 секунды, и каждая точка данных являетсязначение записи ЭЭГ в другой момент времени.Итак, теперь у нас есть 23 x 500 = 11500 фрагментов информации (строка), каждая информация содержит 178 точек данных за 1 секунду (столбец), последний столбец представляет метку y {1,2,3,4,5}.}

cvacc =[]
j=0
kf=KFold(n_splits=10, random_state=None, shuffle=False)
for train_index, test_index in kf.split(X):
    print('\nFold ',j)
    X_train, X_test = X[train_index], X[test_index] 
    y_train, y_test = y[train_index], y[test_index]

    # create model
    # 1D CNN neural network
    model = Sequential() 
    model.add(Conv1D(filters=10, kernel_size=10,             
    strides=1,activation='relu', input_shape=(3450,177)))
    model.add(Conv1D(filters=10, kernel_size=10, strides=1))
    model.add(MaxPooling1D(2))
    model.add(Conv1D(30,10,activation='relu', strides=1))
    model.add(Conv1D(30,10,activation='relu', strides=1))
    model.add(MaxPooling1D(2))
    model.add(Conv1D(60,10,activation='relu', strides=1))
    model.add(Conv1D(60,10,activation='relu', strides=1))
    model.add(MaxPooling1D(2))
    model.add(Conv1D(90,10,activation='relu', strides=1))
    model.add(Conv1D(90,10,activation='relu', strides=1))
    model.add(MaxPooling1D(2))
    model.add(Conv1D(120,10,activation='relu', strides=1))
    model.add(Conv1D(120,10,activation='relu', strides=1))
    model.add(MaxPooling1D(2))
    model.add(Flatten())
    model.add(Dense(50))
    model.add(Dense (20))
    model.add(Dense (5,activation='softmax'))
    # print(model.summary())

    model.compile(loss='categorical_crossentropy',
          optimizer='adam',
          metrics=['accuracy'])

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

history=model.fit(X_train, y_train, batch_size=3, 
epochs=15,validation_split=0.1)

1 Ответ

0 голосов
/ 21 марта 2019

Точность. to doc https://keras.io/layers/convolutional/, ваш ввод должен быть 3D-тензором формы (batch_size, steps, input_dim), где batch_size - количество серий в серии, steps - количество временных шагов в серии, input_dim - размерность одного шага в серии. Для вас steps = 178.

Попробуйте изменить первую строку в модели на:

model.add(Conv1D(filters=10, kernel_size=10,             
    strides=1,activation='relu', input_shape=(178, 1)))

(Нам не нужно упоминать значение batch_size. Его можно оставить неопределенным до тренировки.)

Ваши тренировочные данные должны соответствовать этим параметрам. X_train.shape должно быть (*, 178, 1)

Примечание: вы получите дальнейшие ошибки, так как слои не являются правильными. После третьего уровня пула число шагов будет равно 6, а следующий слой свертки имеет stride 10 (> 6) и будет выдавать ошибки. Вы должны перенастроить слои.

...