Размерная ошибка для классификации текста с использованием слоя conv2d в керасе

#python #tensorflow #keras

#питон #тензорный поток #keras

Вопрос:

У меня есть фрейм данных, который я разделил на набор поездов и тестов, и форма ввода для набора поездов равна (4115 588). Теперь я хочу создать нейронную сеть со слоями Conv2D, но столкнусь с этой ошибкой, когда передам аргумент входной формы. Ошибка значения: Ввод 0 слоя sequential_8 несовместим со слоем: : ожидаемый min_ndim=4, найденный ndim=3. Полная форма получена: (Нет, 588, 1) Я попробовал выполнить следующие действия:

 X_train = X_train.to_numpy() X_train = X_train.reshape((X_train.shape[0], X_train.shape[1],1))  model = Sequential() model.add(Conv2D(128, kernel_size=(3,3), input_shape=(X_train.shape[0],588,1),  activation='relu')) model.add(MaxPooling2D()) model.add(Conv2D(64, kernel_size=(3,3), activation='relu')) model.add(MaxPooling2D()) model.add(Conv2D(32, kernel_size=(3,3), activation='relu')) model.add(MaxPooling2D()) model.add(Flatten()) model.add(Dense(1, activation='sigmoid'))  

Может ли кто-нибудь подсказать мне, как решить эту ошибку. Я относительно новичок в этой теме.

Комментарии:

1. Вы должны использовать Conv1D вместо Conv2D , а ваш input_shape input_shape=(588,1) не должен input_shape=(X_train.shape[0],588,1)

2. @AloneTogether я построил еще одну модель для Conv1D, которая отлично работает. Я просто хотел посмотреть, работает ли это и с Conv2D. Кстати, можете ли вы сказать, почему я не должен использовать Conv2D в этом случае?

3. Конечно. Ваши данные 2D. Conv2D требуется 3D (исключая размер пакета).

4. Ах, теперь я понимаю. Большое спасибо!

Ответ №1:

Conv2D ожидает ввода формы, тензора 4 D с формой: batch_shape (channels, rows, cols) если data_format=’channels_first’ или тензора 4 D с формой: batch_shape (rows, cols, channels) если data_format=’channels_last’.

Я проверил ваш код с помощью mnist, чтобы он работал. Рабочий пример кода

 from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Dropout, Flatten import tensorflow as tf  (X_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() #X_train = X_train.to_numpy() #X_train = X_train.reshape((X_train.shape[0], X_train.shape[1],1))   model = tf.keras.Sequential() model.add(Conv2D(128, kernel_size=(3,3), input_shape=(28,28,1),  activation='relu')) model.add(MaxPooling2D()) model.add(Conv2D(64, kernel_size=(3,3), activation='relu')) model.add(MaxPooling2D()) model.add(Conv2D(32, kernel_size=(3,3), activation='relu')) model.add(MaxPooling2D()) model.add(Flatten()) model.add(Dense(1, activation='sigmoid'))   model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),  optimizer=tf.keras.optimizers.Adam(),  metrics=['accuracy']) model.fit(X_train,  y_train,  batch_size=128,  epochs=1,  verbose=1)  

Выход

 469/469 [==============================] - 137s 289ms/step - loss: -10766237696.0000 - accuracy: 0.1124