1. 存储Error(txt文件)
import numpy as np
# Error
error_u = np.linalg.norm(exact_u_current - predict_np_u, 2) / np.linalg.norm(exact_u_current, 2)
error_v = np.linalg.norm(exact_v_current - predict_np_v, 2) / np.linalg.norm(exact_v_current, 2)
error_p = np.linalg.norm(exact_p_current - predict_np_p, 2) / np.linalg.norm(exact_p_current, 2)
print('Error u: %e' % error_u)
print('Error v: %e' % error_v)
print('Error p: %e' % error_p)
# 打开一个文件以追加写入模式
with open('errors.txt', 'a') as file:
file.write('\n')
file.write('From t = %f to t = %f\n' % (t_current[0], t_current[-1]))
file.write('Error u: %e\n' % error_u)
file.write('Error v: %e\n' % error_v)
file.write('Error p: %e\n' % error_p)
file.write('\n')
这里的with open(‘errors.txt’, ‘a’) as file:的’a’指的是追加模式 (append mode)。如果文件不存在,会创建一个新文件。如果文件存在,新的内容会被追加到文件的末尾,而不会覆盖原有内容。
而with open(‘errors.txt’, ‘w’) as file:的’w’表示写入模式 (write mode)。如果文件不存在,会创建一个新文件。如果文件存在,原有内容会被清空,新的内容会覆盖原有内容。
2. 存储数值 (matlab文件)
import os
import scipy.io
file_name = "./current_figures_matlab_data/"
if not os.path.exists(file_name):
os.mkdir(file_name)
scipy.io.savemat(file_name + "Sol_" + params_name + "_" + str(pic_num) + ".mat",
{'x': unique_x, 'y': unique_y, 't': t_current,
'exact_u_current': exact_u_current, 'predict_np_u': predict_np_u,
'exact_v_current': exact_v_current, 'predict_np_v': predict_np_v,
'exact_p_current': exact_p_current, 'predict_np_p': predict_np_p,
'exact_u_current_plot_final': exact_u_current, 'u_pred_plot_final': u_pred_plot_final,
'exact_v_current_plot_final': exact_v_current, 'v_pred_plot_final': v_pred_plot_final,
'exact_p_current_plot_final': exact_p_current, 'p_pred_plot_final': p_pred_plot_final})
储存为.mat文件,这样后期就可以直接在MATLAB画图或者做其他分析。
3. 储存loss数值 (csv文件)
import numpy as np
def print_boundary_value_count(AM_count, current_t_num):
np.savetxt("boundary_value/boundary_value_top" + params_name + "_" + str(current_t_num) + "_" + str(AM_count) + ".csv", model.boundary_value_top_collect, delimiter=',',
header='x,y,pred,given')
np.savetxt("boundary_value/boundary_value_bottom" + params_name + "_" + str(current_t_num) + "_" + str(AM_count) + ".csv", model.boundary_value_bottom_collect, delimiter=',',
header='x,y,pred,given')
np.savetxt("boundary_value/boundary_value_left" + params_name + "_" + str(current_t_num) + "_" + str(AM_count) + ".csv", model.boundary_value_left_collect, delimiter=',',
header='x,y,pred,given')
np.savetxt("boundary_value/boundary_value_right" + params_name + "_" + str(current_t_num) + "_" + str(AM_count) + ".csv", model.boundary_value_right_collect, delimiter=',',
header='x,y,pred,given')
这里虽然是.csv文件,但是可以用excel打开,只需要在excel里全选把格式改一下就能看见数据。
或者用以下方式存储为.csv文件
import pandas as pd
# 创建一个DataFrame来存储实际值和预测值
results = pd.DataFrame({
'Actual': u_test,
'Predicted': u_pred
})
# 将DataFrame保存为CSV文件
results.to_csv('predictions.csv', index=False)
4. 储存预测值 (excel文件)
import pandas as pd
# 创建一个DataFrame来存储实际值和预测值
results = pd.DataFrame({
'Actual': u_test,
'Predicted': u_pred
})
# 将DataFrame保存为Excel文件
results.to_excel('predictions.xlsx', index=False)
5. 储存训练模型 (pt文件)
if model.save:
torch.save(model.net.state_dict(), './models/' + params_name + "-" + str(i) + "-" + '.pt')
Note:
以上所有代码都是不完整的,部分是从我自己代码抽取出来整理的。只是提供一个思路。
作用只是为了我自己后期需要用到这个功能然后看一眼知道大概怎么处理而已。
代码出现很多的params_name是一个我自己创建的参数名称,用了argparse.ArgumentParser()。
params_name = ("_2D_" + str(args.PDE_type) + "_" + str(version_num) + "_ADAM=" + str(args.adam_iter) + "_LBFGS=" + str(args.lbfgs_iter)
+ "_Nx=" + str(args.num_x) + "_Ny=" + str(args.num_y) + "_N=" + str(args.N) + "_M=" + str(args.M) + "_Mb=" + str(args.M_b)
+ "_h=" + str(args.hid_layers) + "_n=" + str(args.hid_neurons) + "_ADAMlr=" + str(args.lbfgs_lr)
+ "_modelType=" + str(args.model_type) + "_AMType=" + str(args.AM_type) + "_AMk=" + str(args.AM_K)
+ "_AMCount=" + str(args.AM_count) + "_AWlr=" + str(args.AW_lr) + "_q=" + str(args.q)
+ "_move_type=" + str(args.move_type) + "_init=" + str(args.init_cond)
+ "_bound=" + str(args.boundary_cond) + "_ep=" + str(args.epsilon)
+ "_Ld=" + str(args.L_d) + "_")
额外补充
import os
from datetime import datetime
# 获取当前日期和时间
current_datetime = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
# 构建文件夹路径
folder_path = f'./debug_h0-{current_datetime}/'
# 确保目录存在
os.makedirs(folder_path, exist_ok=True)
# 保存图像
globals()[f"h_0_pre_{model.net.iter}"].savefig(
f"{folder_path}Sol_h0_{iter_num}{params_name}_{t_current[-1]}.png",
dpi=500, bbox_inches='tight'
)