Skip to content
4 changes: 2 additions & 2 deletions docs/zh/examples/lorenz.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
=== "模型导出命令"

``` sh
python train_enn.py mode=export
python train_transformer.py mode=export EMBEDDING_MODEL_PATH=https://paddle-org.bj.bcebos.com/paddlescience/models/lorenz/lorenz_pretrained.pdparams
```

=== "模型推理命令"
Expand All @@ -43,7 +43,7 @@
# windows
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/transformer_physx/lorenz_training_rk.hdf5 --output ./datasets/lorenz_training_rk.hdf5
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/transformer_physx/lorenz_valid_rk.hdf5 --output ./datasets/lorenz_valid_rk.hdf5
python train_transformer.py mode=infer EMBEDDING_MODEL_PATH=https://paddle-org.bj.bcebos.com/paddlescience/models/lorenz/lorenz_pretrained.pdparams
python train_transformer.py mode=infer
```

| 模型 | MSE |
Expand Down
4 changes: 2 additions & 2 deletions docs/zh/examples/rossler.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
=== "模型导出命令"

``` sh
python train_transformer.py mode=export
python train_transformer.py mode=export EMBEDDING_MODEL_PATH=https://paddle-org.bj.bcebos.com/paddlescience/models/rossler/rossler_pretrained.pdparams
```

=== "模型推理命令"
Expand All @@ -43,7 +43,7 @@
# windows
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/transformer_physx/rossler_training.hdf5 --output ./datasets/rossler_training.hdf5
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/transformer_physx/rossler_valid.hdf5 --output ./datasets/rossler_valid.hdf5
python train_transformer.py mode=infer EMBEDDING_MODEL_PATH=https://paddle-org.bj.bcebos.com/paddlescience/models/rossler/rossler_pretrained.pdparams
python train_transformer.py mode=infer
```

| 模型 | MSE |
Expand Down
30 changes: 14 additions & 16 deletions examples/lorenz/train_transformer.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,14 @@ def evaluate(cfg: DictConfig):

def export(cfg: DictConfig):
# set model
model = ppsci.arch.PhysformerGPT2(**cfg.MODEL)
embedding_model = build_embedding_model(cfg.EMBEDDING_MODEL_PATH)
model_cfg = {
**cfg.MODEL,
"embedding_model": embedding_model,
"input_keys": ["states"],
"output_keys": ["pred_states"],
}
model = ppsci.arch.PhysformerGPT2(**model_cfg)

# initialize solver
solver = ppsci.solver.Solver(
Expand All @@ -259,7 +266,7 @@ def export(cfg: DictConfig):

input_spec = [
{
key: InputSpec([None, 256, 32], "float32", name=key)
key: InputSpec([None, 255, 3], "float32", name=key)
for key in model.input_keys
},
]
Expand All @@ -272,42 +279,33 @@ def inference(cfg: DictConfig):

predictor = pinn_predictor.PINNPredictor(cfg)

embedding_model = build_embedding_model(cfg.EMBEDDING_MODEL_PATH)
output_transform = OutputTransform(embedding_model)
dataset_cfg = {
"name": "LorenzDataset",
"file_path": cfg.VALID_FILE_PATH,
"input_keys": cfg.MODEL.input_keys,
"label_keys": cfg.MODEL.output_keys,
"block_size": cfg.VALID_BLOCK_SIZE,
"stride": 1024,
"embedding_model": embedding_model,
}

dataset = ppsci.data.dataset.build_dataset(dataset_cfg)

input_dict = {
"embeds": dataset.embedding_data[: cfg.VIS_DATA_NUMS, :-1, :],
"states": dataset.data[: cfg.VIS_DATA_NUMS, :-1, :],
}

output_dict = predictor.predict(
{key: input_dict[key] for key in cfg.MODEL.input_keys}, cfg.INFER.batch_size
)
output_dict = predictor.predict(input_dict, cfg.INFER.batch_size)

# mapping data to cfg.INFER.output_keys
output_keys = ["pred_states"]
output_dict = {
store_key: paddle.to_tensor(output_dict[infer_key])
for store_key, infer_key in zip(cfg.MODEL.output_keys, output_dict.keys())
store_key: output_dict[infer_key]
for store_key, infer_key in zip(output_keys, output_dict.keys())
}

input_dict = {
"states": dataset.data[: cfg.VIS_DATA_NUMS, 1:, :],
}

output_dict = {
"pred_states": output_transform(output_dict).numpy(),
}

data_dict = {**input_dict, **output_dict}
for i in range(cfg.VIS_DATA_NUMS):
ppsci.visualize.save_plot_from_3d_dict(
Expand Down
29 changes: 14 additions & 15 deletions examples/rossler/train_transformer.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,14 @@ def evaluate(cfg: DictConfig):

def export(cfg: DictConfig):
# set model
model = ppsci.arch.PhysformerGPT2(**cfg.MODEL)
embedding_model = build_embedding_model(cfg.EMBEDDING_MODEL_PATH)
model_cfg = {
**cfg.MODEL,
"embedding_model": embedding_model,
"input_keys": ["states"],
"output_keys": ["pred_states"],
}
model = ppsci.arch.PhysformerGPT2(**model_cfg)

# initialize solver
solver = ppsci.solver.Solver(
Expand All @@ -258,7 +265,7 @@ def export(cfg: DictConfig):

input_spec = [
{
key: InputSpec([None, 256, 32], "float32", name=key)
key: InputSpec([None, 255, 3], "float32", name=key)
for key in model.input_keys
},
]
Expand All @@ -271,42 +278,34 @@ def inference(cfg: DictConfig):

predictor = pinn_predictor.PINNPredictor(cfg)

embedding_model = build_embedding_model(cfg.EMBEDDING_MODEL_PATH)
output_transform = OutputTransform(embedding_model)
dataset_cfg = {
"name": "RosslerDataset",
"file_path": cfg.VALID_FILE_PATH,
"input_keys": cfg.MODEL.input_keys,
"label_keys": cfg.MODEL.output_keys,
"block_size": cfg.VALID_BLOCK_SIZE,
"stride": 1024,
"embedding_model": embedding_model,
}

dataset = ppsci.data.dataset.build_dataset(dataset_cfg)

input_dict = {
"embeds": dataset.embedding_data[: cfg.VIS_DATA_NUMS, :-1, :],
"states": dataset.data[: cfg.VIS_DATA_NUMS, :-1, :],
}

output_dict = predictor.predict(
{key: input_dict[key] for key in cfg.MODEL.input_keys}, cfg.INFER.batch_size
)
output_dict = predictor.predict(input_dict, cfg.INFER.batch_size)

# mapping data to cfg.INFER.output_keys
output_keys = ["pred_states"]
output_dict = {
store_key: paddle.to_tensor(output_dict[infer_key])
for store_key, infer_key in zip(cfg.MODEL.output_keys, output_dict.keys())
store_key: output_dict[infer_key]
for store_key, infer_key in zip(output_keys, output_dict.keys())
}

input_dict = {
"states": dataset.data[: cfg.VIS_DATA_NUMS, 1:, :],
}

output_dict = {
"pred_states": output_transform(output_dict).numpy(),
}

data_dict = {**input_dict, **output_dict}
for i in range(cfg.VIS_DATA_NUMS):
ppsci.visualize.save_plot_from_3d_dict(
Expand Down
14 changes: 13 additions & 1 deletion ppsci/arch/physx_transformer.py
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,9 @@ class PhysformerGPT2(base.Arch):
attn_pdrop (float, optional): The dropout probability used on attention weights. Defaults to 0.0.
resid_pdrop (float, optional): The dropout probability used on block outputs. Defaults to 0.0.
initializer_range (float, optional): Initializer range of linear layer. Defaults to 0.05.
embedding_model (Optional[base.Arch]): Embedding model, If this parameter is set,
the embedding model will map the input data to the embedding space and the
output data to the physical space. Defaults to None.

Examples:
>>> import ppsci
Expand All @@ -269,6 +272,7 @@ def __init__(
attn_pdrop: float = 0.0,
resid_pdrop: float = 0.0,
initializer_range: float = 0.05,
embedding_model: Optional[base.Arch] = None,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

docstring加上embedding_model,并说明有和没有时,模型计算行为上的区别

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

):
super().__init__()
self.input_keys = input_keys
Expand Down Expand Up @@ -296,6 +300,7 @@ def __init__(
self.linear = nn.Linear(embed_size, embed_size)

self.apply(self._init_weights)
self.embedding_model = embedding_model

def _init_weights(self, module):
if isinstance(module, nn.Linear):
Expand Down Expand Up @@ -344,7 +349,7 @@ def _generate_time_series(self, x, max_length):
def generate(self, x, max_length=256):
if max_length <= 0:
raise ValueError(
"max_length({max_length}) should be a strictly positive integer."
f"max_length({max_length}) should be a strictly positive integer."
)
outputs = self._generate_time_series(x, max_length)
return outputs
Expand Down Expand Up @@ -375,10 +380,17 @@ def forward(self, x):
if self._input_transform is not None:
x = self._input_transform(x)
x_tensor = self.concat_to_tensor(x, self.input_keys, axis=-1)
if self.embedding_model is not None:
x_tensor = self.embedding_model.encoder(x_tensor)

if self.training:
y = self.forward_tensor(x_tensor)
else:
y = self.forward_eval(x_tensor)

if self.embedding_model is not None:
y = (self.embedding_model.decoder(y[0]),)

y = self.split_to_dict(y, self.output_keys)
if self._output_transform is not None:
y = self._output_transform(x, y)
Expand Down