Грешка при проверка на входа: очаква се conv2d_1_input да има 4 измерения, но получи масив с форма (800, 1000)

Опитвам се да направя сантиментален анализ, използвайки 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)

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 слой изисква входната форма да бъде 4D тензор (проби, редове, колони, канали), където пробите са размерът на партидата. Имате само две. Какви данни имате?   -  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

Добавих слой за вграждане и замених 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