TensorFlow:我如何从两个数组生成数据集?



我一直在尝试从两个数组生成自定义数据集。一个形状为(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这样的架构。

相关内容

  • 没有找到相关文章

最新更新