它们分别由两个全连接层组成。
它包含一个编码器和一个解码器。
它用于加载数据集,构造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)