我有一个 1x2048 像素作为输入的 1D 图像和 32 个类,我已经定义了一层 32 个过滤器,这些过滤器的大小与图像 (1x2048( 相同,它们是 L1 正则化的。
我的图像示例是一热的。但是,我的目标是在将其中一些图像相加并将其馈送到训练模型时获得多热编码输出。
训练进行得很顺利,它可以单独对每个类进行分类,但是如果我对两个图像求和并将其提供给模型,它只会输出一个单热编码向量(尽管我期望一个双热编码向量(。如果我在训练后查看内核,它们是有意义的,因为除了定义我的类的权重之外,大多数权重都是零。
我不明白为什么我得到的是单热矢量输出而不是多热矢量。
我还没有对图像求和并使用它们来训练模型的原因是,使图像的可能组合超出了我的记忆能力。
我心目中的网络形象
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'])
您使用了错误的损失函数
无论输入如何,categorical_crossentropy
都会始终在向量中返回一个1 值。它尝试将每个实例分类为一个(且仅一个(可用类。
但是,您想要的是输出中的(可能(多个。因此,您应该改用binary_crossentropy
。另请参阅此帖子。
附带说明一下,我强烈建议您真正考虑两次,因为 - 如果您实际上没有经常遇到多个类的情况,则可能会导致大量误报。 即,您预测多个类的情况。
另一方面,您可能需要考虑使用Conv1D
,因为您的信号只是一维的。
@Azerila 您正在寻找的是混合增强。它的实现方式如下:
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