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)