Skip to content

Commit 996df12

Browse files
committed
feat(ppsci): support data_effient_nopt for training and test
1 parent 617d37a commit 996df12

File tree

4 files changed

+127
-18
lines changed

4 files changed

+127
-18
lines changed

examples/data_efficient_nopt/data_utils/datasets_ns.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1214,7 +1214,7 @@
12141214
# int((sigma * 4 + 1) / 2) * 2 + 1, (data_blur.shape[-1] // 2) * 2 - 1
12151215
# )
12161216
# if _kernel >= 2:
1217-
# data_blur = functional.gaussian_blur(
1217+
# data_blur = gaussian_blur(
12181218
# data_blur, kernel_size=[_kernel, _kernel], sigma=sigma
12191219
# )
12201220
# data_blur = data_blur.permute(1, 2, 0)

examples/data_efficient_nopt/models/fno.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -258,28 +258,31 @@ def forward_icl(self, x, demo_xs, demo_ys, use_tqdm=False):
258258
demo_xs_aug = []
259259
for _ in range(repeat):
260260
if sum(sigma_range) > 0:
261-
raise NotImplementedError("Gaussian blur is not implemented in paddle.")
262-
# sigma = random.uniform(*sigma_range)
263-
# # https://github.com/scipy/scipy/blob/v1.11.4/scipy/ndimage/_filters.py#L232
264-
# _kernel = min(
265-
# int((sigma * 4 + 1) / 2) * 2 + 1, (x.shape[1] // 2) * 2 - 1
266-
# )
261+
import random
262+
263+
sigma = random.uniform(*sigma_range)
264+
# https://github.com/scipy/scipy/blob/v1.11.4/scipy/ndimage/_filters.py#L232
265+
_kernel = min(
266+
int((sigma * 4 + 1) / 2) * 2 + 1, (x.shape[1] // 2) * 2 - 1
267+
)
267268
mask = paddle.nn.functional.dropout(paddle.ones([1, C, H, W]), p=p)
268269
######
270+
from .gaussian_blur import gaussian_blur
271+
269272
if sum(sigma_range) > 0:
270-
# [TODO]
271-
raise NotImplementedError("Gaussian blur is not implemented in paddle.")
272-
# _x_aug = torchvision.transforms.functional.gaussian_blur(x.clone(), kernel_size=[_kernel, _kernel], sigma=sigma)
273+
_x_aug = gaussian_blur(
274+
x.clone(), kernel_size=[_kernel, _kernel], sigma=sigma
275+
)
273276
else:
274277
_x_aug = x.clone()
275278
_x_aug = _x_aug * mask
276279
x_aug.append(_x_aug)
277280
######
278281
_demo_xs_aug = []
279282
if sum(sigma_range) > 0:
280-
# [TODO]
281-
raise NotImplementedError("Gaussian blur is not implemented in paddle.")
282-
# _demo_xs_aug = torchvision.transforms.functional.gaussian_blur(demo_xs.clone(), kernel_size=[_kernel, _kernel], sigma=sigma)
283+
_demo_xs_aug = gaussian_blur(
284+
demo_xs.clone(), kernel_size=[_kernel, _kernel], sigma=sigma
285+
)
283286
else:
284287
_demo_xs_aug = demo_xs.clone()
285288
_demo_xs_aug = _demo_xs_aug * mask
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
from typing import List
2+
3+
import paddle
4+
import paddle.tensor as Tensor
5+
6+
7+
def _cast_squeeze_in(img: Tensor, req_dtypes: List[paddle.dtype]):
8+
need_squeeze = False
9+
# make image NCHW
10+
if img.ndim < 4:
11+
img = img.unsqueeze(axis=0)
12+
need_squeeze = True
13+
14+
out_dtype = img.dtype
15+
need_cast = False
16+
if out_dtype not in req_dtypes:
17+
need_cast = True
18+
req_dtype = req_dtypes[0]
19+
img = img.to(req_dtype)
20+
return img, need_cast, need_squeeze, out_dtype
21+
22+
23+
def _get_gaussian_kernel1d(
24+
kernel_size: int, sigma: float, dtype: paddle.dtype
25+
) -> Tensor:
26+
ksize_half = (kernel_size - 1) * 0.5
27+
28+
x = paddle.linspace(-ksize_half, ksize_half, num=kernel_size, dtype=dtype)
29+
pdf = paddle.exp(-0.5 * (x / sigma).pow(2))
30+
kernel1d = pdf / pdf.sum()
31+
32+
return kernel1d
33+
34+
35+
def _get_gaussian_kernel2d(
36+
kernel_size: List[int], sigma: List[float], dtype: paddle.dtype
37+
) -> Tensor:
38+
kernel1d_x = _get_gaussian_kernel1d(kernel_size[0], sigma[0], dtype)
39+
kernel1d_y = _get_gaussian_kernel1d(kernel_size[1], sigma[1], dtype)
40+
kernel2d = paddle.mm(kernel1d_y[:, None], kernel1d_x[None, :])
41+
return kernel2d
42+
43+
44+
def _cast_squeeze_out(
45+
img: Tensor, need_cast: bool, need_squeeze: bool, out_dtype: paddle.dtype
46+
) -> Tensor:
47+
if need_squeeze:
48+
img = img.squeeze(axis=0)
49+
50+
if need_cast:
51+
if out_dtype in (
52+
paddle.uint8,
53+
paddle.int8,
54+
paddle.int16,
55+
paddle.int32,
56+
paddle.int64,
57+
):
58+
# it is better to round before cast
59+
img = paddle.round(img)
60+
img = img.to(out_dtype)
61+
62+
return img
63+
64+
65+
def gaussian_blur(img: Tensor, kernel_size: List[int], sigma: List[float]) -> Tensor:
66+
if sigma is None:
67+
sigma = [ksize * 0.15 + 0.35 for ksize in kernel_size]
68+
69+
if sigma is not None and not isinstance(sigma, (int, float, list, tuple)):
70+
raise TypeError(
71+
f"sigma should be either float or sequence of floats. Got {type(sigma)}"
72+
)
73+
if isinstance(sigma, (int, float)):
74+
sigma = [float(sigma), float(sigma)]
75+
if isinstance(sigma, (list, tuple)) and len(sigma) == 1:
76+
sigma = [sigma[0], sigma[0]]
77+
if len(sigma) != 2:
78+
raise ValueError(
79+
f"If sigma is a sequence, its length should be 2. Got {len(sigma)}"
80+
)
81+
for s in sigma:
82+
if s <= 0.0:
83+
raise ValueError(f"sigma should have positive values. Got {sigma}")
84+
# print(f"img: {img}")
85+
# if not (isinstance(img, Tensor)):
86+
# raise TypeError(f"img should be Tensor. Got {type(img)}")
87+
88+
dtype = img.dtype if paddle.is_floating_point(img) else paddle.float32
89+
kernel = _get_gaussian_kernel2d(kernel_size, sigma, dtype=dtype)
90+
kernel = kernel.expand([img.shape[-3], 1, kernel.shape[0], kernel.shape[1]])
91+
92+
img, need_cast, need_squeeze, out_dtype = _cast_squeeze_in(img, [kernel.dtype])
93+
94+
# padding = (left, right, top, bottom)
95+
padding = [
96+
kernel_size[0] // 2,
97+
kernel_size[0] // 2,
98+
kernel_size[1] // 2,
99+
kernel_size[1] // 2,
100+
]
101+
img = paddle.nn.functional.pad(img, padding, mode="reflect")
102+
img = paddle.nn.functional.conv2d(img, kernel, groups=img.shape[-3])
103+
104+
img = _cast_squeeze_out(img, need_cast, need_squeeze, out_dtype)
105+
return img

examples/data_efficient_nopt/pretrain_basic.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
# from dadaptation import DAdaptAdan
2424
from einops import rearrange
2525
from models.fno import fno_pretrain
26+
from models.gaussian_blur import gaussian_blur
2627
from models.vmae import build_vmae
2728

2829
# from paddle import DataParallel
@@ -411,11 +412,11 @@ def train_one_epoch(self):
411412
int((sigma * 4 + 1) / 2) * 2 + 1,
412413
(_inp.shape[2] // 2) * 2 - 1,
413414
)
414-
# if _kernel >= 2:
415-
# # [https://github.com/PaddlePaddle/Paddle/issues/26568]
416-
# _inp = functional.gaussian_blur(
417-
# _inp, kernel_size=[_kernel, _kernel], sigma=sigma
418-
# )
415+
if _kernel >= 2:
416+
# [https://github.com/PaddlePaddle/Paddle/issues/26568]
417+
_inp = gaussian_blur(
418+
_inp, kernel_size=[_kernel, _kernel], sigma=sigma
419+
)
419420
inp_blur.append(_inp)
420421
inp_blur = paddle.stack(inp_blur, axis=0)
421422
else:

0 commit comments

Comments
 (0)