【发布时间】: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