如何在镜像编码器/解码器权重的情况下创建自动编码器(转置)

时间:2018-07-05 06:58:48

标签: python tensorflow machine-learning deep-learning autoencoder

我正在尝试使用TensorFlow构建我的第一个自动编码器神经网络。编码器和解码器中各层的尺寸相同,只是相反。自动编码器学会了将图像数据压缩和重构为合理的标准,但是我想通过将解码器作为编码器的精确转置来尝试提高其性能。

我对TensorFlow中的操作方法一无所知。

以下是我的网络建设的摘要:

imgW, imgH = 28, 28
encoderDims = [
    imgW * imgH,
    (imgW // 2) * (imgH // 2),
    (imgW // 3) * (imgH // 3),
    (imgW // 4) * (imgH // 4)
]
decoderDims = list(reversed(encoderDims))

encoderWeights, encoderBiases = [], []
decoderWeights, decoderBiases = [], []
for layer in range(len(encoderDims) - 1):
    encoderWeights.append(
        tf.Variable(tf.random_normal([encoderDims[layer], encoderDims[layer + 1]]))
    )
    encoderBiases.append(
        tf.Variable(tf.random_normal([encoderDims[layer + 1]]))
    )
    decoderWeights.append(
        tf.Variable(tf.random_normal([decoderDims[layer], decoderDims[layer + 1]]))
    )
    decoderBiases.append(
        tf.Variable(tf.random_normal([decoderDims[layer + 1]]))
    )

input = tf.placeholder(tf.float32, [None, imgW * imgH])
encoded = input
for layer in range(len(encoderDims) - 1):
    encoded = tf.add(tf.matmul(encoded, encoderWeights[layer]), encoderBiases[layer])
    encoded = tf.nn.sigmoid(encoded)

decoded = encoded
for layer in range(len(decoderDims) - 1):
    decoded = tf.add(tf.matmul(decoded, decoderWeights[layer]), decoderBiases[layer])
    if layer != len(decoderDims) - 2:
        decoded = tf.nn.sigmoid(decoded)

loss = tf.losses.mean_squared_error(labels=input, predictions=decoded)
train = tf.train.AdamOptimizer(learningRate).minimize(loss)

我不知道如何克服的两个问题是:

  1. 在训练过程中如何针对损耗进行调整仅编码器参数
  2. 如何创建解码器权重和偏差,使得在每次训练编码器参数的迭代之后,将它们设置为新调整的编码器参数的转置?

1 个答案:

答案 0 :(得分:0)

我怀疑这是否会胜过常规的自动编码器。但是,如果您应该获得令人惊讶的良好结果,请告知社区。关于您的问题:

1。)由于您必须在输入和输出之间使用一些重构错误,因此唯一的选择是对整个网络进行训练(例如,整个编码器和解码器)。但是,您可以为解码器变量设置一个标志,以防止它们在初始化后被算法更改。将它们设置为GameBoardView。训练一个时期之后,您可以将它们手动设置为转置的编码器权重。

2。)在这里,我不确定您如何解释“转置”。如果您表示编码器的第1层的权重应与解码器的最后一层的权重相匹配,则可以尝试以下方法:

trainable=False

如果要单独转置图层矩阵,则可以使用所说的for layer in range(len(encoderWeights)): decoderWeights[-layer-1] = tf.transpose(encoderWeights[layer]) 。从数学的角度来看,矩阵乘法的正确逆运算将是逆矩阵(如果已定义)。 TensorFlow确实为此提供了tf.tranpose()。但是,使用此方法时要非常小心,因为不能保证获得合理的结果。