python - 将非线性激活函数与 softmax 结合使用时,自动编码器的结果不佳
问题描述
我正在对数据进行自动编码器训练,其中每个观察结果都是p=[p_1, p_2,...,p_n]
where 0<p_i<1
for 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
激活函数时,结果非常好。但是,当我尝试使用非线性激活函数(relu
或sigmoid
)时,结果会更糟。这可能是什么原因?
解决方案
推荐阅读
- powershell - 如何在 PowerShell 中使用 ForEach 计算数组中小于 10 的数字?
- rest - MULE (3.x) anypoint studio 中的 RAML 提供了一个空有效负载
- laravel-5 - Laravel 一对一关系显示属性非对象
- javascript - 转译顶级 node_modules 依赖的 ES6 嵌套 node_modules 依赖
- eclipse - eclipse断点和应用程序之间的链接不起作用
- rxjs - 动态更新可观察对象或类型号
- python - 如何停止烧瓶将包含 json 格式数据的列表再次转换为 json?
- c - 动态数组的内存分配
- swift - NSPersistentCloudKitContainer 将 NSManagedObject 子类恢复为历史值
- mysql - mysql - 每年每一行的月/年总和