106 lines
2.6 KiB
Python
106 lines
2.6 KiB
Python
|
import torch
|
|||
|
import torch.nn as nn
|
|||
|
import pandas as pd
|
|||
|
from abc import ABC, abstractmethod
|
|||
|
|
|||
|
from sklearn.metrics import confusion_matrix as cm
|
|||
|
|
|||
|
from torch.utils.data import DataLoader, TensorDataset
|
|||
|
from Qfunctions.divSet import divSet as ds
|
|||
|
from Qfunctions.saveToxlsx import save_to_xlsx as stx
|
|||
|
|
|||
|
|
|||
|
class Qnn(nn.Module, ABC):
|
|||
|
|
|||
|
def __init__(self, data, labels=None, test_size=0.2, random_state=None):
|
|||
|
super(Qnn, self).__init__()
|
|||
|
|
|||
|
self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
|||
|
|
|||
|
# 保存原始labe, 混淆矩阵使用
|
|||
|
self.original_labels = labels
|
|||
|
|
|||
|
# 划分训练集和测试集
|
|||
|
X_train, X_test, y_train, y_test, self.labels = ds(
|
|||
|
data=data,
|
|||
|
labels=labels,
|
|||
|
test_size=test_size,
|
|||
|
random_state=random_state
|
|||
|
)
|
|||
|
|
|||
|
self.train_loader, self.test_loader = self.__prepare_data(
|
|||
|
X_train=X_train,
|
|||
|
y_train=y_train,
|
|||
|
X_test=X_test,
|
|||
|
y_test=y_test
|
|||
|
)
|
|||
|
|
|||
|
# 定义结果
|
|||
|
self.result = {
|
|||
|
'acc_and_loss' : {
|
|||
|
'epoch' : [],
|
|||
|
'loss': [],
|
|||
|
'train_accuracy': [],
|
|||
|
'test_accuracy': [],
|
|||
|
},
|
|||
|
'confusion_matrix': None,
|
|||
|
}
|
|||
|
|
|||
|
def accuracy(self, output, target):
|
|||
|
pass
|
|||
|
|
|||
|
# 定义损失函数
|
|||
|
def hinge_loss(self, output, target):
|
|||
|
pass
|
|||
|
|
|||
|
@abstractmethod
|
|||
|
def train_model(self, train_loader, test_loader, epochs):
|
|||
|
pass
|
|||
|
|
|||
|
def confusion_matrix(self, test_outputs):
|
|||
|
predicted = torch.argmax(test_outputs, dim=1)
|
|||
|
true_label = torch.argmax(self.y_test, dim=1)
|
|||
|
return cm(predicted.cpu(), true_label.cpu())
|
|||
|
|
|||
|
def fit(self, epochs = 100):
|
|||
|
self.train_model(epochs)
|
|||
|
|
|||
|
def save(self, project_name):
|
|||
|
for filename, data in self.result.items():
|
|||
|
if filename == 'confusion_matrix':
|
|||
|
data = pd.DataFrame(data, columns=self.original_labels, index=self.original_labels)
|
|||
|
stx(project_name, filename, data)
|
|||
|
else:
|
|||
|
data = pd.DataFrame(data)
|
|||
|
stx(project_name, filename, data)
|
|||
|
|
|||
|
def __prepare_data(self, X_train, y_train, X_test, y_test):
|
|||
|
|
|||
|
X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
|
|||
|
y_train_tensor = torch.tensor(y_train, dtype=torch.long)
|
|||
|
|
|||
|
X_test_tensor = torch.tensor(X_test, dtype=torch.float32)
|
|||
|
y_test_tensor = torch.tensor(y_test, dtype=torch.long)
|
|||
|
|
|||
|
train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
|
|||
|
test_dataset = TensorDataset(X_test_tensor, y_test_tensor)
|
|||
|
|
|||
|
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
|
|||
|
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)
|
|||
|
|
|||
|
print(train_loader, test_loader)
|
|||
|
|
|||
|
return train_loader, test_loader
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|