减少自动编码器的损耗

时间:2020-05-26 12:12:48

标签: python deep-learning compression autoencoder

我目前正在尝试训练一种自动编码器,该编码器允许将长度为128的整数变量的数组表示形式压缩为64。该数组包含128个整数值,范围从0到255。

我训练模型每个时期有超过200万个数据点。每个数组的格式如下:[1,9,0,4,255,7,6,...,200]

input_img = Input(shape=(128,))
encoded = Dense(128, activation=activation)(input_img)
encoded = Dense(128, activation=activation)(encoded)

encoded = Dense(64, activation=activation)(encoded)

decoded = Dense(128, activation=activation)(encoded)
decoded = Dense(128, activation='linear')(decoded)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='mse')

history = autoencoder.fit(np.array(training), np.array(training),
                    epochs=50,
                    batch_size=256,
                    shuffle=True,
                    validation_data=(np.array(test), np.array(test)),
                    callbacks=[checkpoint, early_stopping])

我还将上传一张显示培训和验证过程的图形:Loss graph of Training

我怎么可能进一步降低损失。到目前为止,我已经尝试过(无论哪种方法都无法成功):

  1. 更长的培训阶段
  2. 更多层

1 个答案:

答案 0 :(得分:2)

当然,不是很神奇的事情,您可以立即减少损失,因为它是针对特定问题的,但是我建议您使用以下几招:

  • 减小小批量。批量较小时,反向传播时会使梯度变得更嘈杂。首先,这可能看起来违反直觉,但是梯度下降中的这种噪声可以帮助下降克服可能的局部最小值。这样想吧;当下降嘈杂时,将花费更长的时间,但是平稳期会更低;当下降平稳时,它将花费更少的时间,但是会停留在更早的平稳期。 (非常笼统!)
  • 尝试使图层的单位具有扩展/收缩顺序。因此,不要将其背对背使用128个单位层,而是将其设置为128到256。这样,您就不会强迫模型用另一组128个数字表示128个数字。您可以使所有层具有128个单位,从理论上讲 会产生 less 自动编码的结果,其中输入和输出实际上是相同的。但是由于梯度下降的性质,在实践中不会发生这种情况。就像您在丛林中的某个地方随机开始,并尝试沿着一条线索(负坡度)穿过它,但是仅仅因为您拥有线索并不意味着您可以到达前往目的地。因此,要从分布中获取有意义的信息,您应该强制模型以较小的单位表示信息。因为您要设置先决条件,这将使梯度下降的工作更加容易。如果它不能对信息进行足够好的编码,则会损失很大。因此,您可以理解您对模型的期望。
  • 误差函数的绝对值。您正在尝试降低损失,但目的是什么?您是否需要使其接近0,还是只需要使其尽可能低些?因为随着潜在维度的缩小,损耗会增加,但是自动编码器将能够更好地捕获数据的潜在代表信息。因为您要强制编码器用较小的信息表示较高的信息。因此,潜在维度越小,自动编码器将越努力尝试从输入中提取最有意义的信息,因为它的空间有限。因此,即使损失更大,也可以更有效地捕获分配。因此,要解决您的问题,如果您想降低图像的噪点,使用更高的编码尺寸,但是如果您想进行异常检测,最好尝试使用更低的尺寸而不完全破坏模型的代表性。 。
  • 这是我的 tinfoil 的更多建议,但您也尝试将数字向下移动,以使范围为-128至128。我不太准确地观察到某些激活(尤其是ReLU)在这种输入下效果更好。

我希望其中一些对您有用。祝你好运。