我正在尝试将 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()
剧情:
答案 0 :(得分:0)
此错误表示预期的维度尚未传递给模型。模型期望的第一维是批次。因此,在将数据传递给 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
。所以你可以删除这个参数。