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

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

Мой код указан ниже.

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)

Ответы [ 3 ]

0 голосов
/ 03 апреля 2019

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

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

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

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

X = X[np.newaxis, ..., np.newaxis]
0 голосов
/ 04 апреля 2019

Я добавил слой Embedding и заменил 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']) 
0 голосов
/ 03 апреля 2019

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

вроде:

X = np.expand_dims(X, axis=-1)
...