一键热编码标签___多键热编码输出_Keras

时间:2018-09-25 22:01:59

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

我有一个输入为1x2048像素的1D图像和32个类别,为此我定义了32个滤镜层,它们的大小与经过L1调节的图像(1x2048)相同。

我的图像示例令人难以忘怀。但是,我的目标是在将这些图像中的一些加在一起并将其馈送到经过训练的模型时,获得多次编码的输出。

训练进行得很顺利,它可以分别对每个类别进行分类,但是如果我对两个图像求和并将其馈送到模型中,则它只会输出一个热编码的矢量(尽管我希望是两个热编码的矢量)。如果我在训练后查看内核,它们是有道理的,因为除定义我班级的那些权重外,大多数权重都为零。

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

我尚未对图像进行求和并用于训练模型的原因是,可能使图像的可能组合超出了我的存储能力。

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'])

2 个答案:

答案 0 :(得分:0)

您使用了错误的损失功能

不管输入如何,

categorical_crossentropy始终会在向量中精确返回一个 1值。它将尝试将每个实例分类为一个(只有一个)可用的类。

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

在一个旁注中,我强烈建议您考虑两次,因为-如果您确实没有经常使用多个类的情况,则可能会导致很多误报。也就是说,在某些情况下您获得的班级预计不只一个。

另一方面,由于信号仅为一维信号,因此您可能要考虑使用Conv1D

答案 1 :(得分:0)

@阿塞拜疆 您正在寻找的是 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