赞
踩
它们分别由两个全连接层组成。
它包含一个编码器和一个解码器。
它用于加载数据集,构造tensor数据集。
定义超参数。
提取需要的特征和标签,对特征进行数据标准化。
构造tensor数据集并封装为可迭代对象,创建Dataloader对象,用于批量读取数据。
初始化模型、损失函数和优化器
训练模型,并输出每个epoch的损失值。
使用训练好的自编码器模型对数据集进行特征提取,并将提取的特征保存为csv文件。
需要注意的是,这段代码没有包含模型的测试部分,但是在训练之后,可以使用训练好的自编码器模型对新的数据进行特征提取。
# -*- coding: utf-8 -*- # @Time : 2023/5/25 14:29 # @Author : huangjian # @File : AE.py import torch import torch.nn as nn from torch.utils.data import DataLoader, Dataset import pandas as pd from sklearn import preprocessing # 定义编码器 class Encoder(nn.Module): def __init__(self, input_dim, hidden_dim, latent_dim): super(Encoder, self).__init__() self.fc1 = nn.Linear(input_dim, hidden_dim) self.fc2 = nn.Linear(hidden_dim, latent_dim) self.relu = nn.ReLU() def forward(self, x): x = self.relu(self.fc1(x)) x = self.fc2(x) return x # 定义解码器 class Decoder(nn.Module): def __init__(self, latent_dim, hidden_dim, output_dim): super(Decoder, self).__init__() self.fc1 = nn.Linear(latent_dim, hidden_dim) self.fc2 = nn.Linear(hidden_dim, output_dim) self.relu = nn.ReLU() def forward(self, x): x = self.relu(self.fc1(x)) x = self.fc2(x) return x # 定义自编码器 class Autoencoder(nn.Module): def __init__(self, input_dim, hidden_dim, latent_dim): super(Autoencoder, self).__init__() self.encoder = Encoder(input_dim, hidden_dim, latent_dim) self.decoder = Decoder(latent_dim, hidden_dim, input_dim) def forward(self, x): x = self.encoder(x) x = self.decoder(x) return x # 定义自定义数据集 class MyDataset(Dataset): def __init__(self, data): self.data = data def __len__(self): return len(self.data) def __getitem__(self, index): x = self.data[index] return torch.Tensor(x) # 参数初始化 input_size = 9 # 输入数据维度 hidden_size = 64 # 隐藏层维度 output_size = 6 # 输出维度 learning_rate = 0.001 # 学习率 num_epochs = 50 # 迭代次数 batch_size = 128 # 每次迭代的批次大小 feature_select = ['timestamp', 'day_of_week', 'is_weekend', 'is_holiday', 'temperature', 'is_start_of_semester', 'is_during_semester', 'month', 'hour'] # 加载数据集 data = pd.read_csv("dataset.csv", engine='python') # 提取特征和标签 x_data, y_data = data[feature_select], data["label"] # 数据标准化 standardScaler = preprocessing.StandardScaler() standardScaler.fit(x_data) x_train = standardScaler.transform(x_data) # 加载数据集 train_dataset = MyDataset(x_train) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) # 模型初始化 autoencoder = Autoencoder(input_size, hidden_size, output_size) # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = torch.optim.Adam(autoencoder.parameters(), lr=0.001) # 训练模型 for epoch in range(num_epochs): for data in train_loader: inputs = data optimizer.zero_grad() outputs = autoencoder(inputs) loss = criterion(outputs, inputs) loss.backward() optimizer.step() print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # 测试模型 autoencoder.eval() with torch.no_grad(): features = [] for data in train_loader: feature = autoencoder.encoder(data) features.append(feature) features = torch.cat(features, dim=0) features = features.numpy() print(features.shape) features = pd.DataFrame(features) features.to_csv("AE_features.csv", index=False)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。