Ошибка CNN Keras: ожидается, что последовательность будет иметь 3 измерения, но получит массив с формой (500, 400) - PullRequest
0 голосов
/ 25 ноября 2018

Я получаю эту ошибку.Я совершенно новичок в ML.

ValueError: Ошибка при проверке ввода: ожидается, что последовательность имеет 3 измерения, но получил массив с формой (500, 400)

Ниже приведены коды, которые я использую.

print(X1_Train.shape)
print(X2_Train.shape)
print(y_train.shape)

====================================
Output (here I've 500 rows in each):
(500, 400)
(500, 1500)
(500,)

400 => timesteps (below)
1500 => n (below)
====================================


timesteps = 50 * 8
n = 50 * 30

def createClassifier():
    sequence = Input(shape=(timesteps, 1), name='Sequence')
    features = Input(shape=(n,), name='Features')

    conv = Sequential()
    conv.add(Conv1D(10, 5, activation='relu', input_shape=(timesteps, 1)))
    conv.add(Conv1D(10, 5, activation='relu'))
    conv.add(MaxPool1D(2))
    conv.add(Dropout(0.5))

    conv.add(Conv1D(5, 6, activation='relu'))
    conv.add(Conv1D(5, 6, activation='relu'))
    conv.add(MaxPool1D(2))
    conv.add(Dropout(0.5))
    conv.add(Flatten())
    part1 = conv(sequence)

    merged = concatenate([part1, features])

    final = Dense(512, activation='relu')(merged)
    final = Dropout(0.5)(final)
    final = Dense(num_class, activation='softmax')(final)

    model = Model(inputs=[sequence, features], outputs=[final])
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

model = createClassifier()
# print(model.summary())
history = model.fit([X1_Train, X2_Train], y_train, epochs =5)

Любое понимание, пожалуйста?Заранее спасибо.

1 Ответ

0 голосов
/ 25 ноября 2018

Две вещи -

Слой Conv1D ожидает, что вход будет иметь форму (batch_size, x, filters), в вашем случае (500,400,1).
Вам необходимо изменить форму входного слоя, добавить еще одну ось размером 1. (это ничего не меняет в ваших данных).

Вы пытаетесь использовать несколько входов, последовательный API - не лучший выбор для этого.Я бы рекомендовал использовать Функциональный API

Редактировать: Что касается вашего комментария, не уверен, что вы сделали неправильно, но это рабочая версия вашего кода (с фальшивкойданные), с изменением формы:

import keras

import numpy as np



X1_Train = np.ones((500,400))
X2_Train = np.ones((500,1500))
y_train = np.ones((500))
print(X1_Train.shape)
print(X2_Train.shape)
print(y_train.shape)

num_class = 1


timesteps = 50 * 8
n = 50 * 30

def createClassifier():
    sequence = keras.layers.Input(shape=(timesteps, 1), name='Sequence')
    features = keras.layers.Input(shape=(n,), name='Features')

    conv = keras.Sequential()
    conv.add(keras.layers.Conv1D(10, 5, activation='relu', input_shape=(timesteps, 1)))
    conv.add(keras.layers.Conv1D(10, 5, activation='relu'))
    conv.add(keras.layers.MaxPool1D(2))
    conv.add(keras.layers.Dropout(0.5))

    conv.add(keras.layers.Conv1D(5, 6, activation='relu'))
    conv.add(keras.layers.Conv1D(5, 6, activation='relu'))
    conv.add(keras.layers.MaxPool1D(2))
    conv.add(keras.layers.Dropout(0.5))
    conv.add(keras.layers.Flatten())
    part1 = conv(sequence)

    merged = keras.layers.concatenate([part1, features])

    final = keras.layers.Dense(512, activation='relu')(merged)
    final = keras.layers.Dropout(0.5)(final)
    final = keras.layers.Dense(num_class, activation='softmax')(final)

    model = keras.Model(inputs=[sequence, features], outputs=[final])
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

model = createClassifier()
# print(model.summary())
X1_Train = X1_Train.reshape((500,400,1))
history = model.fit([X1_Train, X2_Train], y_train, epochs =5)

С выводом:

Using TensorFlow backend.
(500, 400)
(500, 1500)
(500,)
Epoch 1/5
500/500 [==============================] - 1s 3ms/step - loss: 1.1921e-07 - acc: 1.0000
Epoch 2/5
500/500 [==============================] - 0s 160us/step - loss: 1.1921e-07 - acc: 1.0000
Epoch 3/5
500/500 [==============================] - 0s 166us/step - loss: 1.1921e-07 - acc: 1.0000
Epoch 4/5
500/500 [==============================] - 0s 154us/step - loss: 1.1921e-07 - acc: 1.0000
Epoch 5/5
500/500 [==============================] - 0s 157us/step - loss: 1.1921e-07 - acc: 1.0000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...