【问题标题】:One-hot-encoded labels___multi-hot-encoded output_Keras一热编码标签___多热编码输出_Keras
【发布时间】:2018-09-25 22:01:59
【问题描述】:

我有一个 1D 图像,输入为 1x2048 像素和 32 个类,我为其定义了一层 32 个过滤器,这些过滤器具有与图像相同大小 (1x2048) 的 L1 正则化。

我的图像示例是一次性编码的。但是,我的目标是在将其中一些图像加在一起并将其提供给经过训练的模型时获得多热编码输出。

训练进行得很好,它可以分别对每个类进行分类,但是如果我将两个图像相加并将其提供给模型,它只会输出一个单热编码向量(尽管我期望一个双热编码向量)。如果我在训练后查看内核,它们是有意义的,因为除了定义我的类的权重之外,大多数权重都是零。

我不明白为什么我得到一个单热向量输出而不是多热向量。

我还没有对图像进行求和并将它们用于训练模型的原因是,将图像组合在一起的可能性超出了我的记忆力。

An image of the network I have in mind

input_shape=(1,2048,1)
model = Sequential()

model.add(Conv2D(32, kernel_size=(1, 2048), strides=(1, 1),
activation='sigmoid', 
input_shape=input_shape,
kernel_regularizer=keras.regularizers.l1(0.01),
kernel_constraint=keras.constraints.non_neg()            ))

model.compile(loss=keras.losses.categorical_crossentropy,     
optimizer=optimizer,metrics=['accuracy'])

【问题讨论】:

    标签: machine-learning keras conv-neural-network one-hot-encoding multiclass-classification


    【解决方案1】:

    你使用了错误的损失函数

    categorical_crossentropy 将始终在向量中准确地返回 one 1 值,无论输入如何。它试图将每个实例分类为一个(并且只有一个)可用的类。

    但是,您想要的是(可能)输出中的多个。因此,您应该改用binary_crossentropy。另见this post。

    附带说明,我强烈建议您真正考虑两次,因为 - 如果您真的不经常遇到多个类的情况,它可能会导致很多误报。即,预测的类别不止一个。

    另一方面,您可能需要考虑使用Conv1D,因为您的信号只是一维的。

    【讨论】:

      【解决方案2】:

      @Azerila 您正在寻找的是 Mixup 增强。实现如下:

      def mixup(entry1,entry2):
          image1,label1 = entry1
          image2,label2 = entry2
          
          alpha = [0.2]
          dist = tfd.Beta(alpha, alpha)
          l = dist.sample(1)[0][0]
          
          img = l*image1+(1-l)*image2
          lab = l*label1+(1-l)*label2
          
          return img, lab
      

      【讨论】:

        猜你喜欢
        • 2018-12-25
        • 2020-08-05
        • 1970-01-01
        • 2020-04-02
        • 2019-11-18
        • 2020-01-16
        • 2020-09-25
        • 2020-06-14
        • 1970-01-01
        相关资源
        最近更新 更多