Я пытаюсь построить свою первую нейросеть 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)
Две проблемы, которые я не знаю, как преодолеть:
- Как мне настроить только параметры энкодера во время тренировки относительно потери?
- Как я могу создать веса и смещения декодера таким образом, чтобы после каждой итерации обучения параметров кодера они устанавливались как транспонирование вновь настроенных параметров кодера?