Skip to content
This repository was archived by the owner on Sep 28, 2024. It is now read-only.

Commit cb9c30e

Browse files
committed
Transferred DeepONet training task to example
1 parent c6415ce commit cb9c30e

File tree

8 files changed

+49
-33
lines changed

8 files changed

+49
-33
lines changed

Project.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
1010
FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
1111
Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c"
1212
KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c"
13-
MAT = "23992714-dd62-5051-b70f-ba57cb901cac"
1413
Tullio = "bc48ee85-29a4-5162-ae0b-a64e1601d4bc"
1514
Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
1615

example/Burgers/src/Burgers.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ using Flux
55
using CUDA
66

77
include("data.jl")
8+
include("Burgers_deeponet.jl")
89

910
__init__() = register_burgers()
1011

@@ -30,7 +31,7 @@ function train()
3031
Dense(128, 1),
3132
flatten
3233
) |> device
33-
34+
3435
loss(𝐱, 𝐲) = sum(abs2, 𝐲 .- m(𝐱)) / size(𝐱)[end]
3536

3637
loader_train, loader_test = get_dataloader()
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
function train_don()
2+
if has_cuda()
3+
@info "CUDA is on"
4+
device = gpu
5+
CUDA.allowscalar(false)
6+
else
7+
device = cpu
8+
end
9+
10+
x, y = get_data_don(n=300)
11+
xtrain = x[1:280, :]' |> device
12+
xval = x[end-19:end, :]' |device
13+
14+
ytrain = y[1:280, :] |> device
15+
yval = y[end-19:end, :] |> device
16+
17+
grid = collect(range(0, 1, length=1024))' |> device
18+
19+
learning_rate = 0.001
20+
opt = ADAM(learning_rate)
21+
22+
m = DeepONet((1024,1024,1024),(1,1024,1024),gelu,gelu)
23+
loss(xtrain,ytrain,sensor) = Flux.Losses.mse(model(xtrain,sensor),ytrain)
24+
evalcb() = @show(loss(xval,yval,grid))
25+
26+
Flux.@epochs 400 Flux.train!(loss, params(m), [(xtrain,ytrain,grid)], opt, cb = evalcb)
27+
= m(xval, grid)
28+
29+
diffvec = vec(abs.((yval .- ỹ)))
30+
mean_diff = sum(diffvec)/length(diffvec)
31+
return mean_diff
32+
end

example/Burgers/src/data.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ function get_data(; n=2048, Δsamples=2^3, grid_size=div(2^13, Δsamples), T=Flo
2727
return x_loc_data, y_data
2828
end
2929

30+
function get_data_don(; n=2048, Δsamples=2^3, grid_size=div(2^13, Δsamples))
31+
file = matopen(joinpath(datadep"Burgers", "burgers_data_R10.mat"))
32+
x_data = collect(read(file, "a")[1:n, 1:Δsamples:end])
33+
y_data = collect(read(file, "u")[1:n, 1:Δsamples:end])
34+
close(file)
35+
36+
return x_data, y_data
37+
end
38+
3039
function get_dataloader(; n_train=1800, n_test=200, batchsize=100)
3140
𝐱, 𝐲 = get_data(n=2048)
3241

example/Burgers/test/deeponet.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@testset "DeepONet Training Accuracy" begin
2+
ϵ = Burgers.train_don()
3+
4+
@test ϵ < 0.4
5+
end

example/Burgers/test/runtests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ using Test
33

44
@testset "Burgers" begin
55
include("data.jl")
6+
include("deeponet.jl")
67
end

test/burgerset.mat

-4.69 MB
Binary file not shown.

test/deeponet.jl

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -34,34 +34,3 @@ mgrad = Flux.Zygote.gradient((x,p)->sum(model(x,p)),a,sensors)
3434
@test !iszero(Flux.Zygote.gradient((x,p)->sum(model(x,p)),a,sensors)[2])
3535

3636
#training
37-
#dataset containing first 300 initial conditions from the Burgers' equation
38-
#dataset used by Li et al. for Fourier neural operator. The data for the initial
39-
#conditions is sampled at an interval of 8 points, so, the original data has
40-
#2048 ICs at 8192 points, while here we have 300 ICs at 1024 points
41-
vars = matread("burgerset.mat")
42-
43-
xtrain = vars["a"][1:280, :]'
44-
xval = vars["a"][end-19:end, :]'
45-
46-
ytrain = vars["u"][1:280, :]
47-
yval = vars["u"][end-19:end, :]
48-
49-
grid = collect(range(0, 1, length=1024))'
50-
model = DeepONet((1024,1024,1024),(1,1024,1024),gelu,gelu)
51-
52-
learning_rate = 0.001
53-
opt = ADAM(learning_rate)
54-
55-
parameters = params(model)
56-
57-
loss(xtrain,ytrain,sensor) = Flux.Losses.mse(model(xtrain,sensor),ytrain)
58-
59-
evalcb() = @show(loss(xval,yval,grid))
60-
61-
Flux.@epochs 400 Flux.train!(loss, parameters, [(xtrain,ytrain,grid)], opt, cb = evalcb)
62-
63-
= model(xval, grid)
64-
65-
diffvec = vec(abs.((yval .- ỹ)))
66-
mean_diff = sum(diffvec)/length(diffvec)
67-
@test mean_diff < 0.4

0 commit comments

Comments
 (0)