尺寸缩减自动编码器Pytorch



我正在尝试使用Autoencoder,您可以在下面看到它作为降维工具,我在想我怎么能";提取物";隐藏层并将其用于我的目的

我的原始数据集在标准缩放下

在这里,我定义了一个字典来集中值

CONFIG = {
'BATCH_SIZE' : 1024,
'LR' : 1e-4,
'WD' : 1e-8,
'EPOCHS': 50
}

在这里,我将训练和测试数据帧的值转换为张量

t_test = torch.FloatTensor(test.values)
t_train = torch.FloatTensor(train.values)

在这里我创建数据加载器

loader_test = torch.utils.data.DataLoader(dataset = t_test,
batch_size = CONFIG['BATCH_SIZE'],
shuffle = True)
loader_train = torch.utils.data.DataLoader(dataset = t_train,
batch_size = CONFIG['BATCH_SIZE'],
shuffle = True)

在这里我创建了类AutoEncoder(AE(

class AE(torch.nn.Module):
def __init__(self):
super().__init__()

self.encoder = torch.nn.Sequential(
torch.nn.Linear(31,16),
torch.nn.ReLU(),
torch.nn.Linear(16, 8),
torch.nn.ReLU(),
torch.nn.Linear(8, 4),
)

self.decoder = torch.nn.Sequential(  
torch.nn.Linear(4, 8),
torch.nn.ReLU(),
torch.nn.Linear(8, 16),
torch.nn.ReLU(),
torch.nn.Linear(16, 31),
)

def forward(self, x):
encoded = self.encoder(x)
decoded = self.decoder(encoded)
return decoded

这里我定义了模型loss_uncion和优化器

model = AE()
loss_function = torch.nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(),
lr = CONFIG['LR'],
weight_decay = CONFIG['WD'])

在这里我计算算法

epochs = CONFIG['EPOCHS']
dict_list = []
for epoch in range(epochs):
for (ix, batch) in enumerate(loader_train):

model.train()
reconstructed = model(batch)

loss = loss_function(reconstructed, batch)

optimizer.zero_grad()
loss.backward()
optimizer.step()
temp_dict = {'Epoch':epoch,'Batch_N':ix,'Batch_L':batch.shape[0],'loss':loss.detach().numpy()}
dict_list.append(temp_dict)

df_learning_o = pd.DataFrame(dict_list)

您不仅可以简单地返回解码输出,还可以返回编码嵌入层,如下所示:

class AE(torch.nn.Module):
def __init__(self):
super().__init__()

self.encoder = torch.nn.Sequential(
torch.nn.Linear(31,16),
torch.nn.ReLU(),
torch.nn.Linear(16, 8),
torch.nn.ReLU(),
torch.nn.Linear(8, 4),
)

self.decoder = torch.nn.Sequential(  
torch.nn.Linear(4, 8),
torch.nn.ReLU(),
torch.nn.Linear(8, 16),
torch.nn.ReLU(),
torch.nn.Linear(16, 31),
)

def forward(self, x):
encoded = self.encoder(x)
decoded = self.decoder(encoded)
return encoded, decoded

当你把一些东西传给你的模型(例如在火车循环中(时,你必须把它改为以下内容:

encoded, reconstructed = model(batch)

现在你可以对编码嵌入做任何你想做的事情,也就是说,这是降维输入。

相关内容

  • 没有找到相关文章

最新更新