pytorch自编码器训练

batchsize设置问题,设置 batch_size = 1,32,64 , 训练速度很慢 ,而且loss也很大,达到上千,
数据的shape为 torch.Size([5152, 1, 2000]) 设置为 batch_size = len(model.encoder(tain_data)) = 5152 时,
训练速度变快 loss也降低很大,但效果并不好 最好才到 loss = 2 左右.
全连接层出nn.Linear(1998, 256)),这里的256是可以人为随意设置么,还是需要与输入有对应关系?

class autoencoder(nn.Module):
    def __init__(self):
        super(autoencoder, self).__init__()
        self.encoder = nn.Sequential(
            nn.Conv1d(1, 1, 3, 1, padding=0),
            nn.ReLU(),
            nn.Linear(1998, 256))

        self.decoder = nn.Sequential(
            nn.Linear(256, 1998),
            nn.ConvTranspose1d(1, 1, 3, 1, padding=0),
            nn.Sigmoid())
    def forward(self, x):
        x = self.encoder(x)
        x = self.decoder(x)
        return x
num_epochs = 100
dataloader = DataLoader(trian_data, batch_size=len(model.encoder(trian_data)), shuffle=True)
model = autoencoder()
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01,
                             weight_decay=1e-5)
for epoch in range(num_epochs):
   total_loss = 0
   for data in dataloader:
        x = data
        x = Variable(x)
        # ===================forward=====================
        output = model(x)
        loss = criterion(output, x)
        # ===================backward====================
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        total_loss += loss.data
     # ===================log========================
   print('epoch [{}/{}], loss:{:.4f}'
       .format(epoch+1, num_epochs, total_loss))

》》》epoch [95/100], loss:2.0771
           epoch [96/100], loss:2.0772
           epoch [97/100], loss:2.0769
           epoch [98/100], loss:2.0767
           epoch [99/100], loss:2.0769
           epoch [100/100], loss:2.0766

batch_size一般为32、64就可以了,不需要用到全部的数据,这样子会导致模型收敛慢。
256只是编码器的输出位数,没有特定约束,跟1998没有任何关系,可以是任意数,只需要保证跟解码器的输入是一样的就行了

batch_size 不是越大越好,也不是越小越好,越大全局优化效果越好,但是速度会慢不少,越少局部效果越好,速度会快不少。
另外你的自编码也只是一层神经网络,所以1998是你的码的位数,而256则是加密后的码。加密是1998->256,解码是256->1998,256是你想要加密成多少位的位数

256是人为设置的,代表你编码器的输出是多大的特征向量,修改没问题,不过在修改的同时,也需要修改解码器的输入,因为编码器输出就是解码器的输入,就是nn.Linear(256, 1998)这一句的256也要修改为你修改成的数字。