我正在尝试使用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)
我不知道如何克服的两个问题是:
答案 0 :(得分:0)
我怀疑这是否会胜过常规的自动编码器。但是,如果您应该获得令人惊讶的良好结果,请告知社区。关于您的问题:
1。)由于您必须在输入和输出之间使用一些重构错误,因此唯一的选择是对整个网络进行训练(例如,整个编码器和解码器)。但是,您可以为解码器变量设置一个标志,以防止它们在初始化后被算法更改。将它们设置为GameBoardView
。训练一个时期之后,您可以将它们手动设置为转置的编码器权重。
2。)在这里,我不确定您如何解释“转置”。如果您表示编码器的第1层的权重应与解码器的最后一层的权重相匹配,则可以尝试以下方法:
trainable=False
如果要单独转置图层矩阵,则可以使用所说的for layer in range(len(encoderWeights)):
decoderWeights[-layer-1] = tf.transpose(encoderWeights[layer])
。从数学的角度来看,矩阵乘法的正确逆运算将是逆矩阵(如果已定义)。 TensorFlow确实为此提供了tf.tranpose()
。但是,使用此方法时要非常小心,因为不能保证获得合理的结果。