首页 > 解决方案 > 将非线性激活函数与 softmax 结合使用时,自动编码器的结果不佳

问题描述

我正在对数据进行自动编码器训练,其中每个观察结果都是p=[p_1, p_2,...,p_n]where 0<p_i<1for all i。此外,每个输入p可以划分为每个部分的总和等于 1 的部分。这是因为元素表示分类分布的p参数并包含多个分类分布的参数。例如,我所拥有的数据来自一个可能如下所示的概率数据库:

概率数据库

为了对我的输出强制执行此约束,我在 Keras 的功能模型 API 中使用了多个 softmax 激活。其实我做的和多标签分类差不多。这可能如下所示:

声发射结构

实现如下:

encoding_dim = 3
numb_cat = len(structure)
inputs = Input(shape=(train_corr.shape[1],))
encoded = Dense(6, activation='linear')(inputs)
encoded = Dense(encoding_dim, activation='linear')(encoded)
decoded = Dense(6, activation='linear')(encoded)
decodes = [Dense(e, activation='softmax')(decoded) for e in structure]

losses = [jsd for j in range(numb_cat)]  # JSD loss function
autoencoder = Model(inputs, decodes)
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
autoencoder.compile(optimizer=sgd, loss=losses, loss_weights=[1 for k in range(numb_cat)])

train_attr_corr = [train_corr[:, i:j] for i, j in zip(np.cumsum(structure_0[:-1]), np.cumsum(structure_0[1:]))]
test_attr_corr = [test_corr[:, i:j] for i, j in zip(np.cumsum(structure_0[:-1]), np.cumsum(structure_0[1:]))]

history = autoencoder.fit(train_corr, train_attr_corr, epochs=100, batch_size=2,
                          shuffle=True,
                          verbose=1, validation_data=(test_corr, test_attr_corr))

其中structure是一个列表,其中包含每个属性具有的类别数量,从而控制输出层中的哪些节点被分组并进入相同的 softmax 层。在上面的例子中,structure = [2,2]。此外,损失jsd是 KL 散度的对称版本。

问题:

使用linear激活函数时,结果非常好。但是,当我尝试使用非线性激活函数(relusigmoid)时,结果会更糟。这可能是什么原因?

标签: pythonkerasneural-networkautoencoderactivation-function

解决方案


推荐阅读