【问题标题】:How to obtain a binary sequence as output of an autoencoder bottleneck?如何获得二进制序列作为自动编码器瓶颈的输出?
【发布时间】:2020-10-08 07:33:35
【问题描述】:

我正在尝试实现一个自动编码器,我想要一个二进制序列作为瓶颈层的输出,因为我想分别使用编码器和解码器。

这是我的自动编码器架构的代码:

inputs_encoder = keras.Input(shape = 2**k)
x = Dense(units=S*2**(k), activation=activation)(inputs_encoder)
x = BatchNormalization(axis=1)(x)
outputs_encoder = Dense(units=N, activation='sigmoid')(x)
model_enc = keras.Model(inputs=inputs_encoder, outputs=outputs_encoder, name = 'encoder_model')


inputs_decoder = keras.Input(shape = N)
x = Dense(units=S * 2 ** (k), activation=activation)(inputs_decoder)
x = BatchNormalization(axis=1)(x)
outputs_decoder = Dense(units=2 ** k, activation='softmax')(x)
model_dec = keras.Model(inputs=inputs_decoder, outputs=outputs_decoder, name = 'decoder_model')


inputs_meta = keras.Input(shape = 2**k)
encoded_bits = model_enc(inputs=inputs_meta) #This is the output I'd like to be binary
decoded_sequence = model_dec(inputs=encoded_bits)
meta_model = keras.Model(inputs=inputs_meta, outputs=decoded_sequence, name = 'meta_model')

我尝试在 sigmoid 层之后使用函数 tf.math.round(x),但由于是不可微函数,所以会导致错误。

然后,我用了一个tf.stop_gradient(tf.math.round(x)-x)+x ```的技巧,解决了梯度问题,但是网络的精度不好。

有没有更好的方法来执行此操作?

【问题讨论】:

    标签: python keras deep-learning autoencoder


    【解决方案1】:

    这看起来像是一个量化问题(如果您需要查找有关该主题的更多信息)。

    我通常看到它的处理方式是在训练中跳过round,只将其应用于评估和推理。这也很好,因为当您比较有和没有舍入步骤的模型性能时,它可以告诉您有多少额外的损失是由舍入(量化)引起的。

    要考虑的一件事是 sigmoid 会给你一个介于 0 和 1 之间的值,所以 round 会破坏大部分信号。通过保留更多位,您可以从模型中获得更多收益。假设每个值保留 3 位,将 sigmoid 的结果乘以 2**3 -1,然后四舍五入给你一个介于 0 和 7 之间的值。在解码器上,你必须在输入之前除以 2**3 -1进入网络。显然,这需要在解码器和编码器之间传输更多比特。但是,您可以牺牲嵌入的维度以保持大小不变​​(只有 1/(2**3) 维度,以补偿每个值的 3 位)。通过这种方式,模型可能更容易获得良好的性能。与往常一样,要找到正确的值,您需要进行一些超参数调整。

    【讨论】:

    • 谢谢你的回答,我去查一下量化问题的文献。我已经尝试过训练网络跳过round 函数并将其仅用于推理,但准确性降低了很多。这就是为什么我要考虑四舍五入来训练它。关于您提出的可能实现我不能使用它,因为我确实需要将编码器输出保持为二进制序列,以便在将其插入解码器之前通过噪声层。
    • @KevinSneiderIbarraLancheros 输出保持二进制。只是不是用 27 位表示 27 个节点,而是用 27 位表示 9 个节点。如果噪声是主要问题(不是大小),为什么不将原始输出转换为抗噪声编码?如果你想训练抗噪编码,那么你真的应该在噪声部分建模。
    猜你喜欢
    • 2021-01-07
    • 2020-07-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 2017-07-11
    • 2016-09-21
    • 2018-10-15
    相关资源
    最近更新 更多