Ошибка при проверке ввода: ожидалось, что conv2d_1_input будет иметь 4 измерения, но получен массив с формой (800, 1000)

я пытаюсь провести сентиментальный анализ с помощью CNN. В моем коде мои данные имеют форму (1000,1000), когда я передаю данные в convolution2D, это выдает мне ошибку. который я не могу решить. Я попробовал решение ниже, но все еще сталкиваюсь с проблемой. При создании CNN я получаю жалобы от Кераса, которые мне непонятны.

Мой код ниже.

TfIdf = TfidfVectorizer(max_features=1000) 
X = TfIdf.fit_transform(x.ravel()) 
Y = df.iloc[:,1:2].values


X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2,random_state=1)

classifier = Sequential()

classifier.add(Convolution2D(32, kernel_size=(3,3), input_shape=(1000, 1000, 1), activation = 'relu'))

classifier.add(MaxPooling2D(pool_size=(2,2)))

classifier.add(Flatten())

classifier.add(Dense(output_dim =  128, activation='relu'))

classifier.add(Dense(output_dim =  1, activation='sigmoid'))

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

classifier.fit(X_train, Y_train, batch_size = 10, nb_epoch = 100, validation_data=(X_test,Y_test))

(loss,accuracy) = classifier.evaluate(X_test,Y_test, batch_size =10)

print(accuracy)

comment
Как это вы говорите, что у вас есть входная форма (1000, 1000), но у вас есть состояния ошибки (800, 1000)? Какова форма X_train?   -  person Sharky    schedule 03.04.2019
comment
это 800 100 для моего x_train, я также пытался указать input_shape = x_train.shape   -  person LUZO    schedule 03.04.2019
comment
Слой conv2d требует, чтобы входная форма была четырехмерным тензором (выборки, строки, столбцы, каналы), где выборки — это размер пакета. У вас есть только два. Какие данные у вас есть?   -  person Sharky    schedule 03.04.2019
comment
это текстовые данные... после TFIDF в форме 1000,1000   -  person LUZO    schedule 03.04.2019
comment
И почему вы решили использовать 2D-свертку, которая в основном используется для работы с изображениями? Если это последовательность, вам нужно использовать рекуррентную сеть или LSTM.   -  person Sharky    schedule 03.04.2019


Ответы (3)


Я могу ошибаться, но для меня вам нужно расширить размер данных, чтобы он соответствовал вашей сети:

как:

X = np.expand_dims(X, axis=-1)
person Thibault Bacqueyrisses    schedule 03.04.2019

Ваша нейронная сеть ожидает, что данные будут четырехмерными. Размеры (samples, rows, columns, channels). Ваши входные данные кажутся только двумерными. Вам нужно добавить первое измерение, которое является сэмплами, поскольку Keras ожидает получить больше сэмплов на входе. Вы можете добавить измерение для образцов в текущую входную матрицу с помощью

X = X[np.newaxis, ...]

Это добавит первое измерение для образцов, которые будут иметь размер 1. Вам также необходимо добавить измерение для каналов, которое в настоящее время отсутствует, в качестве последнего измерения.

Оба действия можно выполнить за один шаг с помощью:

X = X[np.newaxis, ..., np.newaxis]
person Primoz    schedule 03.04.2019

Я добавил слой Embedded и заменил 2d сверточный слой на 1d. но моя точность постоянна, даже если я изменил параметры.

вот мой код.

classifier = Sequential()

classifier.add(Embedding(1000,64,input_length=1000))

classifier.add(Convolution1D(32, kernel_size=3, activation = 'relu'))

classifier.add(MaxPooling1D(pool_size=2))

classifier.add(Flatten())

classifier.add(Dense(output_dim =  128, activation='relu'))

classifier.add(Dense(output_dim =  1, activation='sigmoid'))

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) 
person LUZO    schedule 04.04.2019