我正在尝试使用以下代码行解码位图
img = tf.image.decode_bmp(img, channels=3)
使用.map
函数从中创建图像/标签对的 tf.dataset
test_labeled_ds = test_list_ds.map(process_path)
并将其喂入model.fit
model.fit(test_labeled_ds, epochs=10, validation_data=val_labeled_ds)
使用下面的模型体系结构
i = Input(shape=(40,40,3))
x = Conv2D(32, (3,3), strides=2, activation='relu') (i)
x = Conv2D(64, (3,3), strides=2, activation='relu') (x)
x = Conv2D(128, (3,3), strides=2, activation='relu') (x)
x = Flatten()(x)
x = Dense(512, activation = 'relu')(x)
x = Dropout(0.2)(x)
x = Dense(5, activation ='softmax')(x)
model = Model(i, x)
但是当我运行model.fit
时,出现以下错误
值错误:检查输入时出错:预期input_1有 4 尺寸,但得到形状为 (40、40、3( 的数组
我尝试将输入形状更改为诸如i = Input(shape=(1,40,40,3))
但是后来我在模型中遇到了一个不同的错误:
值错误:图层 conv2d_3 的输入 0 与图层不兼容: 预期 NDIM=4,发现 NDIM=5。收到的完整形状:[无,1,40,40, 注3]
因此,看起来 tf.dataset 实际上是 4dims,并且我的输入应该按照 (40, 40, 3( 指定 3 dims 是正确的
那么为什么这不起作用呢? 在将数据集对象馈送到模型之前,是否必须对数据集对象执行某些操作?
为了将来可能遇到这种情况的任何人的利益,我设法找到了问题所在。线索在错误消息中。我很困惑,因为我的模型清楚地表明输入将是 (40, 40, 3(,但错误说它期望 4 dims 并得到输入 (40, 40, 3(。
但这就是答案。模型"拟合"功能需要 4D 输入。我试图输入整个数据集对象(这是一个 3D 对象(,它期待 4D。
它期待 4D,因为另一个维度是批量大小,这就是为什么当您批量处理数据集并将其输入时,它会突然起作用。对数据进行批处理,添加额外的维度。