#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 Большое спасибо за комментарий.