Frank_LBM/scripts/rom_test.ipynb
2026-02-15 19:21:28 +08:00

264 lines
9.3 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pickle\n",
"import pycuda.driver as cuda\n",
"import sys\n",
"import os\n",
"from datetime import datetime\n",
"from stable_baselines3 import PPO\n",
"\n",
"current_dir = os.path.dirname(os.path.abspath(\"__file__\"))\n",
"parent_dir = os.path.abspath(os.path.join(current_dir, os.pardir))\n",
"output_dir = os.path.join(parent_dir, \"output\")\n",
"os.makedirs(output_dir, exist_ok=True)\n",
"sys.path.append(parent_dir)\n",
"\n",
"cuda.init()\n",
"context2 = cuda.Device(2).make_context()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"with open(os.path.join(output_dir, \"d1a3o12_re100.pkl\"), 'rb') as f:\n",
" data = pickle.load(f)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from gym_env import CustomEnv\n",
"context2.push()\n",
"vec_env = CustomEnv(device_id=2)\n",
"context2.pop()\n",
"model = PPO.load(os.path.join(parent_dir, \"models\", \"d1a3o12_re100.zip\"), env=vec_env, device=\"cuda:2\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"context2.push()\n",
"model_env = model.get_env()\n",
"# obs = model_env.reset()\n",
"obs_init = np.array(model_env.envs[0].save_states.copy())\n",
"context2.pop()\n",
"\n",
"obs_init[:, 6:12] = obs_init[:, 6:12]/model_env.envs[0].force_norm_fact.copy()\n",
"sens_deviation = model_env.envs[0].sens_deviation.copy()\n",
"sens_norm_fact = model_env.envs[0].sens_norm_fact.copy()\n",
"for i in range(6):\n",
" obs_init[:, i] = (obs_init[:, i] - sens_deviation[i]) / sens_norm_fact[i]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"from darts import TimeSeries\n",
"from darts.models import RNNModel # 或者 NBEATSModel、TFTModel 等\n",
"from darts.models import TFTModel\n",
"from darts.dataprocessing.transformers import Scaler\n",
"from typing import List"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"set_obs_train = []\n",
"set_act_train = []\n",
"index = pd.RangeIndex(start=0, stop=480, step=1)\n",
"for i in range(len(data)):\n",
" obs_episolde = np.array(data[i]['observations'])[:, 0]\n",
" if np.any(np.all(obs_episolde == 0, axis=1)):\n",
" # print(f\"Episode {i} contains a row with all zeros in observations.\")\n",
" continue\n",
" else:\n",
" obs_full = np.concatenate((obs_init, obs_episolde), axis=0)\n",
" act_init = np.zeros((len(obs_init), 3))\n",
" act_episolde = np.array(data[i]['actions'])\n",
" act_full = np.concatenate((act_init, act_episolde), axis=0)\n",
"\n",
" obs_ts = TimeSeries.from_times_and_values(\n",
" times=index,\n",
" values=obs_full.astype(np.float32), \n",
" columns=[f\"obs{dim+1}\" for dim in range(12)]\n",
" )\n",
" act_ts = TimeSeries.from_times_and_values(\n",
" times=index,\n",
" values=act_full.astype(np.float32), \n",
" columns=[f\"act{dim+1}\" for dim in range(3)]\n",
" )\n",
"\n",
" set_obs_train.append(obs_ts)\n",
" set_act_train.append(act_ts)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Trainer will use only 1 of 4 GPUs because it is running inside an interactive / notebook environment. You may try to set `Trainer(devices=4)` but please note that multi-GPU inside interactive / notebook environments is considered experimental and unstable. Your mileage may vary.\n",
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"HPU available: False, using: 0 HPUs\n",
"LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1,2,3]\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
" | Name | Type | Params | Mode \n",
"------------------------------------------------------------------------------------------------\n",
"0 | train_metrics | MetricCollection | 0 | train\n",
"1 | val_metrics | MetricCollection | 0 | train\n",
"2 | input_embeddings | _MultiEmbedding | 0 | train\n",
"3 | static_covariates_vsn | _VariableSelectionNetwork | 0 | train\n",
"4 | encoder_vsn | _VariableSelectionNetwork | 17.8 K | train\n",
"5 | decoder_vsn | _VariableSelectionNetwork | 896 | train\n",
"6 | static_context_grn | _GatedResidualNetwork | 4.3 K | train\n",
"7 | static_context_hidden_encoder_grn | _GatedResidualNetwork | 4.3 K | train\n",
"8 | static_context_cell_encoder_grn | _GatedResidualNetwork | 4.3 K | train\n",
"9 | static_context_enrichment | _GatedResidualNetwork | 4.3 K | train\n",
"10 | lstm_encoder | LSTM | 8.4 K | train\n",
"11 | lstm_decoder | LSTM | 8.4 K | train\n",
"12 | post_lstm_gan | _GateAddNorm | 2.2 K | train\n",
"13 | static_enrichment_grn | _GatedResidualNetwork | 5.3 K | train\n",
"14 | multihead_attn | _InterpretableMultiHeadAttention | 2.6 K | train\n",
"15 | post_attn_gan | _GateAddNorm | 2.2 K | train\n",
"16 | feed_forward_block | _GatedResidualNetwork | 4.3 K | train\n",
"17 | pre_output_gan | _GateAddNorm | 2.2 K | train\n",
"18 | output_layer | Linear | 6.7 K | train\n",
"------------------------------------------------------------------------------------------------\n",
"78.2 K Trainable params\n",
"0 Non-trainable params\n",
"78.2 K Total params\n",
"0.313 Total estimated model params size (MB)\n",
"382 Modules in train mode\n",
"0 Modules in eval mode\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 49: 100%|██████████| 12/12 [00:00<00:00, 21.99it/s, train_loss=0.133]"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"`Trainer.fit` stopped: `max_epochs=50` reached.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 49: 100%|██████████| 12/12 [00:00<00:00, 21.93it/s, train_loss=0.133]\n"
]
},
{
"data": {
"text/plain": [
"TFTModel(output_chunk_shift=0, hidden_size=32, lstm_layers=1, num_attention_heads=4, full_attention=False, feed_forward=GatedResidualNetwork, dropout=0.1, hidden_continuous_size=8, categorical_embedding_sizes=None, add_relative_index=True, loss_fn=None, likelihood=None, norm_type=LayerNorm, use_static_covariates=True, input_chunk_length=120, output_chunk_length=1, batch_size=32, n_epochs=50, random_state=42)"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model_tft = TFTModel(\n",
" input_chunk_length=120,\n",
" output_chunk_length=1, # 预测1步\n",
" hidden_size=32,\n",
" lstm_layers=1,\n",
" dropout=0.1,\n",
" batch_size=32,\n",
" n_epochs=50,\n",
" add_relative_index=True,\n",
" random_state=42,\n",
" # 注意TFT支持past_covariates与future_covariates也可设置transformer头等更多超参\n",
")\n",
"\n",
"model_tft.fit(\n",
" series=obs_ts,\n",
" past_covariates=act_ts\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for i in range(360):"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plot_data = obs_full[:, 11]\n",
"import matplotlib.pyplot as plt\n",
"plt.plot(plot_data)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "pycuda_3_10",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.13"
}
},
"nbformat": 4,
"nbformat_minor": 2
}