Spaces:
Sleeping
Sleeping
import pickle | |
import torch | |
import torch.nn as nn | |
import numpy as np | |
import pandas as pd | |
from matplotlib import pyplot as plt | |
from torch.utils.data import Dataset, DataLoader | |
import net_BNN | |
# 使用已训练的模型进行推理 | |
def test_plot(dataloader,model,device,criterion): | |
total_loss = 0.0 | |
num_samples = 0 | |
num_sample = 10 | |
model.eval() | |
with torch.no_grad(): | |
predictions = [] | |
true_labels = [] | |
cov = [] | |
# upp = [] | |
# low = [] | |
for test_features, test_labels in dataloader: | |
# outputs = model(test_features.to(device)) | |
# MC sample | |
sample_output = torch.zeros(num_sample, test_labels.shape[0]).to(device) | |
for i in range(num_sample): | |
sample_output[i] = model(test_features.to(device)).reshape(-1) | |
outputs = torch.Tensor(sample_output.mean(dim=0).unsqueeze(1)).to(device) | |
covs = torch.Tensor(sample_output.std(dim=0).unsqueeze(1)).to(device) | |
loss = criterion(outputs, test_labels.to(device)) | |
total_loss += loss.item() * test_features.size(0) | |
num_samples += test_features.size(0) | |
predictions.append((outputs).tolist()) | |
cov.append(covs.tolist()) | |
true_labels.append((test_labels).tolist()) | |
# upp.append(np.percentile(sample_output.cpu().detach().numpy() * float(C_test),95).tolist()) | |
# low.append(np.percentile(sample_output.cpu().detach().numpy() * float(C_test),5).tolist()) | |
average_loss = total_loss / num_samples | |
print('Validation Loss: {:.8f}'.format(average_loss)) | |
# | |
x = range(len(sum(predictions, []))) | |
pred_array = np.array(sum(predictions, [])).flatten() | |
var_array = np.array(sum(cov, [])).flatten() | |
plt.plot(sum(predictions,[]), label='Predictions') | |
plt.plot(sum(true_labels,[]), label='True Labels') | |
# plt.fill_between(x, upp, low, alpha=0.5, label='Confidence Interval') | |
plt.fill_between(x, pred_array + var_array, pred_array - var_array, alpha=0.5, label='Confidence Interval') | |
plt.legend() | |
plt.xlabel('Sample Index') | |
plt.ylabel('Cycle Capacity/Ah') | |
plt.show() | |
# | |
base_path = r'E:\member\ShiJH\Battery Datasets\SNL_18650_LFP Datasets\modified_dataset' | |
attrib_feature = ['Current','Voltage','Environment_Temperature','Cell_Temperature','SOC'] | |
attrib_label = ['SOH'] | |
with open('./min_max_values.pkl', 'rb') as f: | |
min_val, max_val = pickle.load(f) | |
max_len = 200 | |
input_dim = len(attrib_feature) | |
output_dim = 1 | |
hidden_dim = 64 | |
num_layers = 2 | |
num_heads = 4 | |
lr = 1e-3 | |
max_seq_len = 200 | |
batch_size = 5 | |
C_rated = 1.1 | |
testdata_path = base_path + str('\modified_SNL_18650_LFP_25C_0-100_0.5-3C_b_timeseries.csv') | |
test_data = pd.read_csv(testdata_path) | |
test_data['SOH'] = test_data['cycle capacity'] / test_data['cycle capacity'].values[0] | |
# C_val = val_data[attrib_label].values[0] | |
# scaler_val = train_dataset.scaler | |
test_dataset = net_BNN.CycleDataset( | |
data=test_data, | |
attrib_x=attrib_feature, | |
attrib_y=attrib_label, | |
max_len=max_len, | |
C_rated=C_rated, | |
min_val=min_val, | |
max_val=max_val, | |
mode='test') | |
test_dataloader = DataLoader(test_dataset, batch_size=batch_size,shuffle=False,drop_last=True) | |
# 导入网络结构 | |
model = net_BNN.ATBNN_Model( | |
input_dim = input_dim, | |
output_dim = output_dim, | |
hidden_dim = hidden_dim, | |
num_layers = num_layers, | |
num_heads = num_heads, | |
batch_size = batch_size, | |
max_seq_len= max_seq_len) | |
# model.load_state_dict(torch.load("./model_B/model_epoch634_Trainloss0.00013560_ValLoss0.00107357.pt")) #LOSS=0 | |
# model.load_state_dict(torch.load("./model_B/model_epoch2168_Trainloss0.00001729_ValLoss0.00107112.pt")) | |
model.load_state_dict(torch.load("./model_epoch8876_Trainloss0.00001546_ValLoss0.00022519.pt")) | |
# model.load_state_dict(torch.load("./model/model_epoch1.pt")) | |
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') | |
model.to(device) | |
criterion = nn.MSELoss(reduction='mean') | |
test_plot(test_dataloader,model,device,criterion) |