#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