我一直在尝试从两个数组生成自定义数据集。一个形状为(128,128,6)
(6通道卫星数据),另一个形状为(128,128,1)
(二进制掩码)。我一直在使用功能tf.data.Dataset.from_tensor_slices
:
train_dataset = tf.data.Dataset.from_tensor_slices((train_raster, train_mask))
我得到的是:
<PrefetchDataset element_spec=(TensorSpec(shape=(128, 128, 6), dtype=tf.float32, name=None), TensorSpec(shape=(128, 128, 1), dtype=tf.float32, name=None))>
然而,当我试图通过我的模型运行这个时,我得到这个错误:
ValueError ValueError: `Shapes (None, 128, 128, 1) and (None, 2) are incompatible
(None, 2)
,因为我的输出是2类之一。
在教程中,我看到数据集为<PrefetchDataset shapes: ((None, 128, 128, 3), (None, 128, 128, 1)), types: (tf.float32, tf.float32)>
。有区别吗?如果有,我该如何解决?似乎只有两个张量中的一个在模型中运行,但我不太明白为什么。
模型定义:
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3,3), padding='same', activation=tf.nn.relu, input_shape=(128, 128, 6)), tf.keras.layers.MaxPooling2D((2, 2), strides=2),
tf.keras.layers.Conv2D(64, (3,3), padding='same', activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D((2, 2), strides=2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation=tf.nn.relu),
tf.keras.layers.Dense(2, activation=tf.nn.sigmoid)
])
添加@Kaveh的回答部分的评论对社区的好处因为这解决了用户的问题。(谢谢@Kaveh)
我可以猜到你的最后一层输出2个神经元(对于二进制掩码)。但是由于您已经指定了一个形状为(128,128,1)in的数组你的数据集,它会导致错误。如果你通过了Train_dataset到你的模型,它考虑tuple的第一部分(第一个数组)作为输入,第二个数组(128,128,1)作为标签
如果您打印您的模型摘要,您将看到您的模型输出是只有两个数字(None,2)。但是您需要输出为(128,128,1)。所以,你的数据集没问题。您需要修改您的模型架构。为例如像U-Net这样的架构。