Ответ 1
В этом документе описывается подход для построения сложного сверточного автокодера. На основе этой статьи и некоторых поисков Google я смог реализовать описанную сеть. В принципе, все, что вам нужно, описано в сверточной сети Theano и шумоподавляющих обучающих программах с одним важным исключением: как изменить шаг максимального пула в сверточной сети. Я смог это сделать, используя метод это обсуждение - самая сложная часть - выяснить правильные измерения для W_prime, поскольку они будут зависеть от подавать форвардные фильтры и коэффициент объединения. Вот моя инвертирующая функция:
def get_reconstructed_input(self, hidden):
""" Computes the reconstructed input given the values of the hidden layer """
repeated_conv = conv.conv2d(input = hidden, filters = self.W_prime, border_mode='full')
multiple_conv_out = [repeated_conv.flatten()] * np.prod(self.poolsize)
stacked_conv_neibs = T.stack(*multiple_conv_out).T
stretch_unpooling_out = neibs2images(stacked_conv_neibs, self.pl, self.x.shape)
rectified_linear_activation = lambda x: T.maximum(0.0, x)
return rectified_linear_activation(stretch_unpooling_out + self.b_prime.dimshuffle('x', 0, 'x', 'x'))