Как рассчитать уменьшение размерности / узкое место сверточного автоэнкодера? - PullRequest
0 голосов
/ 13 июля 2020
• 1000 и читал разные статьи, но они меня только запутали.

Я знаю, как работает сверточный слой, но не могу asp объяснить, почему мы должны увеличивать количество входов.

Здесь args.local_z_size = 256

Итак, кодировщик для меня выглядит так:

  • L1: 201 -> 256
  • L2: 256 -> 256
  • L3: 256 -> 512
  • L4: 512 -> 512

После L4 они используют трюк повторной параметризации и используют только среднее значение в качестве входных данных для декодера.

Декодер:

  • L1: 256 -> 201
  • L2: 201 -> 201
  • L3: 201 -> 201
  • L4: 201 -> 201

Итак, как может быть уменьшение размера, если Input = 201 и скрытый размер ist 256? Может кто-нибудь объяснить мне это на этом примере? Может кто-нибудь подскажет, как вычислить узкое место?

class Encoder(nn.Module):
def __init__(self, args):
    super(Encoder, self).__init__()
    
    self.EncoderOutput = collections.namedtuple("EncoderOutput", ["local_dist", "local_sample"])
    
    self.local_net = nn.Sequential(
        custom_nn.Transpose((1, 2)),
        
        custom_nn.CausalConv1d(201, args.local_z_size, kernel_size = 3, stride = 1),
        nn.Tanh(),
        nn.BatchNorm1d(args.local_z_size),
        
        custom_nn.CausalConv1d(args.local_z_size, args.local_z_size, kernel_size = 3, stride = 1),
        nn.Tanh(),
        nn.BatchNorm1d(args.local_z_size),
        
        custom_nn.CausalConv1d(args.local_z_size, 2*args.local_z_size, kernel_size = 3, stride = 1),
        nn.Tanh(),
        nn.BatchNorm1d(2*args.local_z_size),
        
        nn.Conv1d(2*args.local_z_size, 2*args.local_z_size, kernel_size = 1, stride = 1),
        custom_nn.Transpose((1, 2)),
    )
    self.light_dropout = nn.Dropout(0.3)
    
    self.Sigmoid = nn.Sigmoid()

def forward(self, input):
    # input is a tensor of batch x time x features
    assert len(input.size()) == 3
    
    local_out = self.local_net(input)
    
    local_dist = output_to_dist(local_out)
    # local sample has siye batch x sample size x time
    local_z_sample = local_dist.rsample()
    
    return self.EncoderOutput(local_dist=local_dist, local_sample=local_z_sample)


class Decoder(nn.Module):
def __init__(self, args):
    super(Decoder, self).__init__()
    
    self.fc = nn.Sequential(
        custom_nn.Transpose((1,2)),
        nn.Conv1d(args.local_z_size, 201, kernel_size = 1, stride = 1),
        nn.Tanh(),
        nn.BatchNorm1d(201),
        
        nn.Conv1d(201, 201, kernel_size = 1, stride = 1),
        nn.Tanh(),
        nn.BatchNorm1d(201),
        
        nn.Conv1d(201, 201, kernel_size = 1, stride = 1),
        nn.Tanh(),
        nn.BatchNorm1d(201),
        
        nn.Conv1d(201, 201, kernel_size=1, stride=1),
        nn.Sigmoid(),
        custom_nn.Transpose((1,2)),
    )

def forward(self, input):        
    out = self.fc(input)
    
    return out
...