как решить «Ошибка значения: Ввод 0 несовместим с моделью слоя: ожидаемая форма=(Нет, 16, 16, 3), найдена форма=(16, 16, 3)»?

#python #tensorflow

Вопрос:

Я пытаюсь добавить конвейер tf.data в задачу регрессии. Код начинается с чтения значений в файле csv и ввода изображений с помощью cv2.imread. Я разделил данные для обучения, тестирования и проверки с помощью предварительной обработки sklearn.

 print (trainY.shape,valY.shape,testY.shape,trainX.shape,valX.shape, testX.shape)
(159, 1) (69, 1) (58, 1) (159, 16, 16, 3) (69, 16, 16, 3) (58, 16, 16, 3)
 

На шаге текста я определяю наборы данных tf для обучения, тестирования и проверки.

 tr_ds = tf.data.Dataset.from_tensor_slices((trainX, trainY))
vl_ds = tf.data.Dataset.from_tensor_slices((valX, valY))
te_ds = tf.data.Dataset.from_tensor_slices((testX, testY))
 

вот часть модели:

 inputShape = (16, 16, 3)
chanDim = -1
inputs = Input(shape=inputShape)
x = Conv2D(16, (3, 3), padding="same")(inputs)
x = Activation("relu")(x)
x = BatchNormalization(axis=chanDim)(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
..
..
..
x = Dense(4)(x)
x = Activation("relu")(x)
x = Dense(1, activation="linear")(x)

model = Model(inputs, x)

SGD = tf.keras.optimizers.SGD(lr=0.05, momentum=0.2, decay=0.0, nesterov=False)
model.compile(optimizer=SGD, loss='mean_squared_error')

history=model.fit(tr_ds,
                  validation_data=vl_ds,
                  epochs=100,
                  batch_size=2,
                  verbose=2)
 

Подгонка модели возвращает ошибку о проблеме формы модели и входных данных. Кто-нибудь может помочь мне решить эту проблему?

Ошибка:

 ValueError: Input 0 is incompatible with layer model: expected shape=(None, 16, 16, 3), found shape=(16, 16, 3)
 

Прогнозирование и построение графиков:

 preds = model.predict(testX)

plt.plot  ( testY ,label="Actual temp")
plt.plot  ( preds, label="Predicted temp" )
plt.title ('temp estimation')
plt.xlabel("Point #")
plt.ylabel("temp")
plt.legend(loc="upper right")
plt.savefig("temp_estimation.png")
plt.show()
 

Сюжет:

введите описание изображения здесь

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

1. добавьте этот параметр в конструктор модели

2. input_shape = (16, 16, 3)

3. @ Cristofor Спасибо за ответ. Это уже есть в первой строке модели. Что вы подразумеваете под конструктором модели?

4. модель = Модель(входы, x, input_shape = (16, 16, 3))

5. @ Cristofor Я добавил этот аргумент, но он возвращает «Ошибка типа: (‘Аргумент ключевого слова не понят:’, ‘input_shape’)»

Ответ №1:

Эта ошибка указывает на то, что ожидаемое измерение не было передано в модель. Первое, что ожидает модель измерения, — это пакет. Итак, пакуйте свои данные, прежде чем передавать их model.fit() таким образом:

 tr_ds = tf.data.Dataset.from_tensor_slices((trainX, trainY)).batch(2)
vl_ds = tf.data.Dataset.from_tensor_slices((valX, valY)).batch(2)
te_ds = tf.data.Dataset.from_tensor_slices((testX, testY)).batch(2)
 

И если вы передаете объект набора model.fit() данных, вам не нужно указывать batch_size . Таким образом, вы можете удалить этот аргумент.

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

1. Пожалуйста, посмотрите сюжет в конце вопроса. он показывает истинную длину прогнозов, но для фактических данных это близко ко всем данным, которые составляют около 286. вы знаете, как я могу исправить сюжет?

2. @rayan: Похоже, что оба testY и preds находятся в правильной форме (58,1). Но поскольку график testY представляет собой непрерывную линию, а данные не отсортированы, график может сбить вас с толку. Сюжет в разбросе для лучшей интуиции. Например plt.plot(testY, 'ro') , plt.plot(preds, 'go') И.

3. @ Kaveh Большое спасибо за комментарий.