如何使用sample_weight屏蔽Keras中的某些标签

时间:2019-07-09 04:07:35

标签: keras conv-neural-network lstm

我想使用Keras中的ConvLSTM2D模块进行Landsat时间序列图像分类。因此,我有一系列的6波段图像块(假设尺寸为30x30像素),每个块用于不同的观察时间。我想使用所有空间和时间数据,因此我正在考虑使用ConvLSTM2D并为其提供一系列图像。地面真相将是另一张尺寸为30x30的地图,假定每个像素在4个可能的值中都有一个标签,该标签在长度为4的向量中进行一次热编码。但是主要问题是某些像素没有具有有效的标签(例如,由于像素浑浊或其他质量问题)。因此,地图将是真实标签(值1-4)和无效像素(它们在所有零值的一热向量中编码)的混合体。

我本来是想先使用class_weight选项来解决此问题,但我收到错误消息,指出3D +张量不支持该选项。所以我选择使用sample_weight。但是,如果实施正确,我会高度怀疑。它运行无误,但结果远不能令人满意。

这是网络结构,是一个三层网络,每层具有16个过滤器,卷积内核大小为3x3。前两层传递序列,但最后一层仅输出一个大小为30x30x16的3D张量。然后,我使用具有4个滤镜和softmax激活的卷积层,以生成对应于每个标签的4个映射。为了掩盖无效标签,我将输出张量从30x30x4调整为900x4(否则Keras将无法使用sample_weight):

inputs = Input(shape=(None, 30, 30, 6))
x = ConvLSTM2D(filters=16, kernel_size=(3,3), padding='same', return_sequences=True, data_format='channels_last')(inputs)
x = ConvLSTM2D(filters=16, kernel_size=(3,3), padding='same', return_sequences=True, data_format='channels_last')(x)
x = ConvLSTM2D(filters=16, kernel_size=(3,3), padding='same', return_sequences=False, data_format='channels_last')(x)
x = Conv2D(filters=4, kernel_size=(3,3), padding='same', data_format='channels_last', activation='softmax')(x)
outputs = Reshape((30*30,4))(x)

我将Tensorflow数据集用于馈送网络,我的数据集生成数据图序列,标签图和“掩码”图,其中有效标签像素为1,无效标签像素为0。我还将sample_weight_mode="temporal"添加到模型编译语句中。我假设通过这种安排,tensorflow / keras将使用预期的权重。但是,正如我上面提到的,结果不令人满意(精度低),并且我不确定上述实现是否正确。我也不知道如何调试此问题。

还有一个基本问题:在计算损失函数之前,样本权重是对输出样本进行加权还是从一开始就对输入值进行加权?正如每个人都说class_weight可以由sample_weight代替,我认为这意味着sample_weight仅在计算损失函数(最后一个Reshape层的合理性)之前的最后阶段应用,对吗?

0 个答案:

没有答案