From 5095785f97251237517293920ab250409cc46915 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 01/29] add DoublePendulumChaotic dataset --- example/double_pendulum/Project.toml | 0 example/double_pendulum/src/data.jl | 24 +++++++++++++++++++ .../double_pendulum/src/double_pendulum.jl | 0 example/double_pendulum/test/data.jl | 0 4 files changed, 24 insertions(+) create mode 100644 example/double_pendulum/Project.toml create mode 100644 example/double_pendulum/src/data.jl create mode 100644 example/double_pendulum/src/double_pendulum.jl create mode 100644 example/double_pendulum/test/data.jl diff --git a/example/double_pendulum/Project.toml b/example/double_pendulum/Project.toml new file mode 100644 index 00000000..e69de29b diff --git a/example/double_pendulum/src/data.jl b/example/double_pendulum/src/data.jl new file mode 100644 index 00000000..9ef3c55d --- /dev/null +++ b/example/double_pendulum/src/data.jl @@ -0,0 +1,24 @@ +function register_double_pendulum_chaotic() + register(DataDep( + "DoublePendulumChaotic", + """ + Dataset was generated on the basis of 21 individual runs of a double pendulum. + Each of the recorded sequences lasted around 40s and consisted of around 17500 frames. + + * `x_red`: Horizontal pixel coordinate of the red point (the central pivot to the first pendulum) + * `y_red`: Vertical pixel coordinate of the red point (the central pivot to the first pendulum) + * `x_green`: Horizontal pixel coordinate of the green point (the first pendulum) + * `y_green`: Vertical pixel coordinate of the green point (the first pendulum) + * `x_blue`: Horizontal pixel coordinate of the blue point (the second pendulum) + * `y_blue`: Vertical pixel coordinate of the blue point (the second pendulum) + + Page: https://developer.ibm.com/exchanges/data/all/double-pendulum-chaotic/ + """, + "https://dax-cdn.cdn.appdomain.cloud/dax-double-pendulum-chaotic/2.0.1/double-pendulum-chaotic.tar.gz", + post_fetch_method=unpack + )) +end + +function get_double_pendulum_chaotic_data() + +end diff --git a/example/double_pendulum/src/double_pendulum.jl b/example/double_pendulum/src/double_pendulum.jl new file mode 100644 index 00000000..e69de29b diff --git a/example/double_pendulum/test/data.jl b/example/double_pendulum/test/data.jl new file mode 100644 index 00000000..e69de29b From 79cb45c517db89bdb18f5fdde165f09075d16269 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 02/29] build proj for double pendulum --- example/DoublePendulum/Project.toml | 13 +++++++++++++ example/DoublePendulum/src/DoublePendulum.jl | 9 +++++++++ .../{double_pendulum => DoublePendulum}/src/data.jl | 7 ++++++- .../test/data.jl | 0 example/double_pendulum/Project.toml | 0 example/double_pendulum/src/double_pendulum.jl | 0 6 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 example/DoublePendulum/Project.toml create mode 100644 example/DoublePendulum/src/DoublePendulum.jl rename example/{double_pendulum => DoublePendulum}/src/data.jl (84%) rename example/{double_pendulum => DoublePendulum}/test/data.jl (100%) delete mode 100644 example/double_pendulum/Project.toml delete mode 100644 example/double_pendulum/src/double_pendulum.jl diff --git a/example/DoublePendulum/Project.toml b/example/DoublePendulum/Project.toml new file mode 100644 index 00000000..db238a46 --- /dev/null +++ b/example/DoublePendulum/Project.toml @@ -0,0 +1,13 @@ +name = "DoublePendulum" +uuid = "1fc04e5d-1dd1-42ff-8d75-1d53504b2476" + +[deps] +DataDeps = "124859b0-ceae-595e-8997-d05f6a7a8dfe" +Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" +NeuralOperators = "ea5c82af-86e5-48da-8ee1-382d6ad7af4b" + +[extras] +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[targets] +test = ["Test"] diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl new file mode 100644 index 00000000..a0088f25 --- /dev/null +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -0,0 +1,9 @@ +module DoublePendulum + +using NeuralOperators + +include("data.jl") + +__init__() = register_double_pendulum_chaotic() + +end diff --git a/example/double_pendulum/src/data.jl b/example/DoublePendulum/src/data.jl similarity index 84% rename from example/double_pendulum/src/data.jl rename to example/DoublePendulum/src/data.jl index 9ef3c55d..71ac8026 100644 --- a/example/double_pendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -1,3 +1,7 @@ +using DataDeps + +export get_double_pendulum_chaotic_data + function register_double_pendulum_chaotic() register(DataDep( "DoublePendulumChaotic", @@ -15,10 +19,11 @@ function register_double_pendulum_chaotic() Page: https://developer.ibm.com/exchanges/data/all/double-pendulum-chaotic/ """, "https://dax-cdn.cdn.appdomain.cloud/dax-double-pendulum-chaotic/2.0.1/double-pendulum-chaotic.tar.gz", + "4ca743b4b783094693d313ebedc2e8e53cf29821ee8b20abd99f8fb4c0866f8d", post_fetch_method=unpack )) end function get_double_pendulum_chaotic_data() - + data_path = joinpath(datadep"DoublePendulumChaotic", "original", "dpc_dataset_csv") end diff --git a/example/double_pendulum/test/data.jl b/example/DoublePendulum/test/data.jl similarity index 100% rename from example/double_pendulum/test/data.jl rename to example/DoublePendulum/test/data.jl diff --git a/example/double_pendulum/Project.toml b/example/double_pendulum/Project.toml deleted file mode 100644 index e69de29b..00000000 diff --git a/example/double_pendulum/src/double_pendulum.jl b/example/double_pendulum/src/double_pendulum.jl deleted file mode 100644 index e69de29b..00000000 From fd76687406e1f42492edb26144ee1a455c19bdfe Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 03/29] get data from file --- example/DoublePendulum/Project.toml | 3 +++ example/DoublePendulum/src/data.jl | 12 +++++++++++- example/DoublePendulum/test/data.jl | 5 +++++ example/DoublePendulum/test/runtests.jl | 6 ++++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 example/DoublePendulum/test/runtests.jl diff --git a/example/DoublePendulum/Project.toml b/example/DoublePendulum/Project.toml index db238a46..071a600e 100644 --- a/example/DoublePendulum/Project.toml +++ b/example/DoublePendulum/Project.toml @@ -2,9 +2,12 @@ name = "DoublePendulum" uuid = "1fc04e5d-1dd1-42ff-8d75-1d53504b2476" [deps] +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" DataDeps = "124859b0-ceae-595e-8997-d05f6a7a8dfe" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" NeuralOperators = "ea5c82af-86e5-48da-8ee1-382d6ad7af4b" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/example/DoublePendulum/src/data.jl b/example/DoublePendulum/src/data.jl index 71ac8026..49a77bbc 100644 --- a/example/DoublePendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -1,4 +1,6 @@ using DataDeps +using CSV +using DataFrames export get_double_pendulum_chaotic_data @@ -24,6 +26,14 @@ function register_double_pendulum_chaotic() )) end -function get_double_pendulum_chaotic_data() +function get_double_pendulum_chaotic_data(; i=0, n=-1) data_path = joinpath(datadep"DoublePendulumChaotic", "original", "dpc_dataset_csv") + df = CSV.read( + joinpath(data_path, "$i.csv"), + DataFrame, + header=[:x_red, :y_red, :x_green, :y_green, :x_blue, :y_blue] + ) + data = (n<0) ? collect(Matrix(df)') : collect(Matrix(df)')[:, 1:n] + + return data end diff --git a/example/DoublePendulum/test/data.jl b/example/DoublePendulum/test/data.jl index e69de29b..4a55d217 100644 --- a/example/DoublePendulum/test/data.jl +++ b/example/DoublePendulum/test/data.jl @@ -0,0 +1,5 @@ +@testset "get double pendulum chaotic data" begin + xs = get_double_pendulum_chaotic_data(i=0, n=100) + + @test size(xs) == (6, 100) +end diff --git a/example/DoublePendulum/test/runtests.jl b/example/DoublePendulum/test/runtests.jl new file mode 100644 index 00000000..bfdc6d76 --- /dev/null +++ b/example/DoublePendulum/test/runtests.jl @@ -0,0 +1,6 @@ +using DoublePendulum +using Test + +@testset "DoublePendulum" begin + include("data.jl") +end From 4ffe4d0278cb70700d31d60fd8b7701a0d7e0600 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 04/29] data visualization --- example/DoublePendulum/Project.toml | 1 + example/DoublePendulum/notebook/data.jl | 37 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 example/DoublePendulum/notebook/data.jl diff --git a/example/DoublePendulum/Project.toml b/example/DoublePendulum/Project.toml index 071a600e..3cf5b77b 100644 --- a/example/DoublePendulum/Project.toml +++ b/example/DoublePendulum/Project.toml @@ -8,6 +8,7 @@ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" NeuralOperators = "ea5c82af-86e5-48da-8ee1-382d6ad7af4b" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +Pluto = "c3e4b0f8-55cb-11ea-2926-15256bba5781" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/example/DoublePendulum/notebook/data.jl b/example/DoublePendulum/notebook/data.jl new file mode 100644 index 00000000..56941279 --- /dev/null +++ b/example/DoublePendulum/notebook/data.jl @@ -0,0 +1,37 @@ +### A Pluto.jl notebook ### +# v0.15.1 + +using Markdown +using InteractiveUtils + +# ╔═╡ 194baef2-0417-11ec-05ab-4527ef614024 +using Pkg; Pkg.develop(path=".."); Pkg.activate("..") + +# ╔═╡ 38c9ced5-dcf8-4e03-ac07-7c435687861b +begin + using DoublePendulum + using Plots +end + +# ╔═╡ 5268feee-bda2-4612-9d4c-a1db424a11c7 +data = get_double_pendulum_chaotic_data(i=0, n=-1) + +# ╔═╡ 9c8b3f8a-1b85-4c32-a416-ead51b244b94 +begin + anim = @animate for i in 1:1000 + scatter(legend=false, xlim=(0, 2500), ylim=(0, 2500)) + scatter!(data[[1, 3, 5], i], data[[2, 4, 6], i], color=[:red, :green, :blue]) + end + + gif(anim, fps=10) +end + +# ╔═╡ 4a1ebdfe-2524-4d3e-b4ab-520af315063f + + +# ╔═╡ Cell order: +# ╟─194baef2-0417-11ec-05ab-4527ef614024 +# ╠═38c9ced5-dcf8-4e03-ac07-7c435687861b +# ╠═5268feee-bda2-4612-9d4c-a1db424a11c7 +# ╠═9c8b3f8a-1b85-4c32-a416-ead51b244b94 +# ╠═4a1ebdfe-2524-4d3e-b4ab-520af315063f From f77ab98e37238c421f43e701ddb97642d2208c1e Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 05/29] add annotation --- example/DoublePendulum/notebook/data.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/example/DoublePendulum/notebook/data.jl b/example/DoublePendulum/notebook/data.jl index 56941279..de6db15e 100644 --- a/example/DoublePendulum/notebook/data.jl +++ b/example/DoublePendulum/notebook/data.jl @@ -21,6 +21,7 @@ begin anim = @animate for i in 1:1000 scatter(legend=false, xlim=(0, 2500), ylim=(0, 2500)) scatter!(data[[1, 3, 5], i], data[[2, 4, 6], i], color=[:red, :green, :blue]) + annotate!(250, 250, text("i=$i", :left)) end gif(anim, fps=10) From 99ef8015dd583f87574479630ab0ace04e5636e1 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 06/29] get_dataloader --- example/DoublePendulum/src/DoublePendulum.jl | 1 + example/DoublePendulum/src/data.jl | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index a0088f25..7bc4ad91 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -1,6 +1,7 @@ module DoublePendulum using NeuralOperators +using Flux include("data.jl") diff --git a/example/DoublePendulum/src/data.jl b/example/DoublePendulum/src/data.jl index 49a77bbc..8add45b1 100644 --- a/example/DoublePendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -33,7 +33,19 @@ function get_double_pendulum_chaotic_data(; i=0, n=-1) DataFrame, header=[:x_red, :y_red, :x_green, :y_green, :x_blue, :y_blue] ) - data = (n<0) ? collect(Matrix(df)') : collect(Matrix(df)')[:, 1:n] + data = (n < 0) ? collect(Matrix(df)') : collect(Matrix(df)')[:, 1:n] - return data + return Float32.(data) +end + +function get_dataloader(; i=0, n_train=15001, n_test=2501, batchsize=100) + 𝐱 = get_double_pendulum_chaotic_data(; i=i, n=-1) + + 𝐱_train, 𝐲_train = reshape(𝐱[:, 1:(n_train-1)], 1, 6, :), reshape(𝐱[:, 2:n_train], 1, 6, :) + loader_train = Flux.DataLoader((𝐱_train, 𝐲_train), batchsize=batchsize, shuffle=true) + + 𝐱_test, 𝐲_test = reshape(𝐱[:, (end-n_test+1):(end-1)], 1, 6, :), reshape(𝐱[:, (end-n_test+2):end], 1, 6, :) + loader_test = Flux.DataLoader((𝐱_test, 𝐲_test), batchsize=batchsize, shuffle=false) + + return loader_train, loader_test end From 216d8f6c27e807a3aaaf710a7118cadbd08d647b Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 07/29] revise get_dataloader --- example/DoublePendulum/src/data.jl | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/example/DoublePendulum/src/data.jl b/example/DoublePendulum/src/data.jl index 8add45b1..f0c81c18 100644 --- a/example/DoublePendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -38,13 +38,14 @@ function get_double_pendulum_chaotic_data(; i=0, n=-1) return Float32.(data) end -function get_dataloader(; i=0, n_train=15001, n_test=2501, batchsize=100) - 𝐱 = get_double_pendulum_chaotic_data(; i=i, n=-1) +function get_dataloader(; i=0, n_train=15001, n_test=1501, Δn=1024, batchsize=100) + x = reshape(get_double_pendulum_chaotic_data(; i=i, n=-1), :) + 𝐱 = reshape(vcat([x[i:(i+6Δn-1)] for i in 1:6:(length(x)-6(Δn-1))]...), 6, 1024, :) - 𝐱_train, 𝐲_train = reshape(𝐱[:, 1:(n_train-1)], 1, 6, :), reshape(𝐱[:, 2:n_train], 1, 6, :) + 𝐱_train, 𝐲_train = 𝐱[:, :, 1:(n_train-1)], 𝐱[:, :, 2:n_train] loader_train = Flux.DataLoader((𝐱_train, 𝐲_train), batchsize=batchsize, shuffle=true) - 𝐱_test, 𝐲_test = reshape(𝐱[:, (end-n_test+1):(end-1)], 1, 6, :), reshape(𝐱[:, (end-n_test+2):end], 1, 6, :) + 𝐱_test, 𝐲_test = 𝐱[:, :, (end-n_test+1):(end-1)], 𝐱[:, :, (end-n_test+2):end] loader_test = Flux.DataLoader((𝐱_test, 𝐲_test), batchsize=batchsize, shuffle=false) return loader_train, loader_test From 59094352f6dd87fd74d76648e62bee0f054aed5d Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 08/29] normalize data --- example/DoublePendulum/Project.toml | 1 + example/DoublePendulum/notebook/data.jl | 4 ++-- example/DoublePendulum/src/data.jl | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/example/DoublePendulum/Project.toml b/example/DoublePendulum/Project.toml index 3cf5b77b..e360f148 100644 --- a/example/DoublePendulum/Project.toml +++ b/example/DoublePendulum/Project.toml @@ -3,6 +3,7 @@ uuid = "1fc04e5d-1dd1-42ff-8d75-1d53504b2476" [deps] CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" DataDeps = "124859b0-ceae-595e-8997-d05f6a7a8dfe" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" diff --git a/example/DoublePendulum/notebook/data.jl b/example/DoublePendulum/notebook/data.jl index de6db15e..943411fa 100644 --- a/example/DoublePendulum/notebook/data.jl +++ b/example/DoublePendulum/notebook/data.jl @@ -19,9 +19,9 @@ data = get_double_pendulum_chaotic_data(i=0, n=-1) # ╔═╡ 9c8b3f8a-1b85-4c32-a416-ead51b244b94 begin anim = @animate for i in 1:1000 - scatter(legend=false, xlim=(0, 2500), ylim=(0, 2500)) + scatter(legend=false, xlim=(0, 1), ylim=(0, 1)) scatter!(data[[1, 3, 5], i], data[[2, 4, 6], i], color=[:red, :green, :blue]) - annotate!(250, 250, text("i=$i", :left)) + annotate!(0.1, 0.1, text("i=$i", :left)) end gif(anim, fps=10) diff --git a/example/DoublePendulum/src/data.jl b/example/DoublePendulum/src/data.jl index f0c81c18..8a81efde 100644 --- a/example/DoublePendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -35,6 +35,8 @@ function get_double_pendulum_chaotic_data(; i=0, n=-1) ) data = (n < 0) ? collect(Matrix(df)') : collect(Matrix(df)')[:, 1:n] + data /= maximum(data) + return Float32.(data) end From 9d8756cda78848063680d2b49840abfa2d7ca715 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 09/29] implement MNO --- example/DoublePendulum/src/DoublePendulum.jl | 32 ++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index 7bc4ad91..0394e518 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -2,9 +2,41 @@ module DoublePendulum using NeuralOperators using Flux +using CUDA include("data.jl") __init__() = register_double_pendulum_chaotic() +function train() + if has_cuda() + @info "CUDA is on" + device = gpu + CUDA.allowscalar(false) + else + device = cpu + end + + m = Chain( + FourierOperator(6=>6, (16, ), gelu), + FourierOperator(6=>6, (16, ), gelu), + FourierOperator(6=>6, (16, ), gelu), + FourierOperator(6=>6, (16, )), + ) |> device + + loss(𝐱, 𝐲) = sum(abs2, 𝐲 .- m(𝐱)) / size(𝐱)[end] + + loader_train, loader_test = get_dataloader() + + function validate() + validation_losses = [loss(device(𝐱), device(𝐲)) for (𝐱, 𝐲) in loader_test] + @info "loss: $(sum(validation_losses)/length(loader_test))" + end + + data = [(𝐱, 𝐲) for (𝐱, 𝐲) in loader_train] |> device + opt = Flux.Optimiser(WeightDecay(1f-4), Flux.ADAM(1f-4)) + call_back = Flux.throttle(validate, 0.5, leading=false, trailing=true) + Flux.@epochs 500 @time(Flux.train!(loss, params(m), data, opt, cb=call_back)) +end + end From 6280598b1b3162db2d0f5e043245be78183414d5 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 10/29] revise model --- example/DoublePendulum/src/DoublePendulum.jl | 29 ++++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index 0394e518..a517a586 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -18,25 +18,36 @@ function train() end m = Chain( - FourierOperator(6=>6, (16, ), gelu), - FourierOperator(6=>6, (16, ), gelu), - FourierOperator(6=>6, (16, ), gelu), + FourierOperator(6=>6, (16, ), relu), + FourierOperator(6=>6, (16, ), relu), + FourierOperator(6=>6, (16, ), relu), + FourierOperator(6=>6, (16, ), relu), FourierOperator(6=>6, (16, )), ) |> device loss(𝐱, 𝐲) = sum(abs2, 𝐲 .- m(𝐱)) / size(𝐱)[end] + opt = Flux.Optimiser(WeightDecay(1f-4), Flux.ADAM(1f-3)) + loader_train, loader_test = get_dataloader() + data = [(𝐱, 𝐲) for (𝐱, 𝐲) in loader_train] |> device + + loss_bounds = [0.3, 0.05, 0.01] function validate() - validation_losses = [loss(device(𝐱), device(𝐲)) for (𝐱, 𝐲) in loader_test] - @info "loss: $(sum(validation_losses)/length(loader_test))" + validation_loss = sum(loss(device(𝐱), device(𝐲)) for (𝐱, 𝐲) in loader_test)/length(loader_test) + @info "loss: $validation_loss" + + isempty(loss_bounds) && return + if validation_loss < loss_bounds[1] + @warn "change η" + opt.os[2].eta /= 2 + popfirst!(loss_bounds) + end end - data = [(𝐱, 𝐲) for (𝐱, 𝐲) in loader_train] |> device - opt = Flux.Optimiser(WeightDecay(1f-4), Flux.ADAM(1f-4)) - call_back = Flux.throttle(validate, 0.5, leading=false, trailing=true) - Flux.@epochs 500 @time(Flux.train!(loss, params(m), data, opt, cb=call_back)) + call_back = Flux.throttle(validate, 1, leading=false, trailing=true) + Flux.@epochs 300 @time(Flux.train!(loss, params(m), data, opt, cb=call_back)) end end From 50432490a6ddc097960f2d5909633854a0232540 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 11/29] Update example/DoublePendulum/test/data.jl Co-authored-by: Yueh-Hua Tu --- example/DoublePendulum/test/data.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/DoublePendulum/test/data.jl b/example/DoublePendulum/test/data.jl index 4a55d217..36abad27 100644 --- a/example/DoublePendulum/test/data.jl +++ b/example/DoublePendulum/test/data.jl @@ -1,4 +1,4 @@ -@testset "get double pendulum chaotic data" begin +@testset "double pendulum" begin xs = get_double_pendulum_chaotic_data(i=0, n=100) @test size(xs) == (6, 100) From 1d0d7f8a7d4a70b40f7d7dbcca2a90833a199bb0 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 12/29] revise model --- example/DoublePendulum/src/DoublePendulum.jl | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index a517a586..7cea9e25 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -8,7 +8,7 @@ include("data.jl") __init__() = register_double_pendulum_chaotic() -function train() +function train(; loss_bounds=[1, 0.2, 0.1, 0.05, 0.02]) if has_cuda() @info "CUDA is on" device = gpu @@ -18,22 +18,20 @@ function train() end m = Chain( - FourierOperator(6=>6, (16, ), relu), - FourierOperator(6=>6, (16, ), relu), - FourierOperator(6=>6, (16, ), relu), - FourierOperator(6=>6, (16, ), relu), - FourierOperator(6=>6, (16, )), + FourierOperator(6=>64, (16, ), relu), + FourierOperator(64=>64, (16, ), relu), + FourierOperator(64=>64, (16, ), relu), + FourierOperator(64=>6, (16, )), ) |> device loss(𝐱, 𝐲) = sum(abs2, 𝐲 .- m(𝐱)) / size(𝐱)[end] - opt = Flux.Optimiser(WeightDecay(1f-4), Flux.ADAM(1f-3)) + opt = Flux.Optimiser(WeightDecay(1f-4), Flux.ADAM(1f-2)) loader_train, loader_test = get_dataloader() data = [(𝐱, 𝐲) for (𝐱, 𝐲) in loader_train] |> device - loss_bounds = [0.3, 0.05, 0.01] function validate() validation_loss = sum(loss(device(𝐱), device(𝐲)) for (𝐱, 𝐲) in loader_test)/length(loader_test) @info "loss: $validation_loss" From 97772afeb5c708693851e2c144664fcaa6966779 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 13/29] revise model and save model --- example/DoublePendulum/Project.toml | 1 + example/DoublePendulum/model/.gitkeep | 0 example/DoublePendulum/src/DoublePendulum.jl | 20 ++++++++++++++++---- 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 example/DoublePendulum/model/.gitkeep diff --git a/example/DoublePendulum/Project.toml b/example/DoublePendulum/Project.toml index e360f148..ab83693b 100644 --- a/example/DoublePendulum/Project.toml +++ b/example/DoublePendulum/Project.toml @@ -7,6 +7,7 @@ CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" DataDeps = "124859b0-ceae-595e-8997-d05f6a7a8dfe" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" NeuralOperators = "ea5c82af-86e5-48da-8ee1-382d6ad7af4b" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" Pluto = "c3e4b0f8-55cb-11ea-2926-15256bba5781" diff --git a/example/DoublePendulum/model/.gitkeep b/example/DoublePendulum/model/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index 7cea9e25..5ebe9439 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -3,12 +3,19 @@ module DoublePendulum using NeuralOperators using Flux using CUDA +using JLD2 include("data.jl") __init__() = register_double_pendulum_chaotic() -function train(; loss_bounds=[1, 0.2, 0.1, 0.05, 0.02]) +function update_model!(model_file_path, model) + model = cpu(model) + jldsave(model_file_path; model) + @warn "model updated!" +end + +function train(; loss_bounds=[1, 0.3, 0.1, 0.05]) if has_cuda() @info "CUDA is on" device = gpu @@ -21,6 +28,7 @@ function train(; loss_bounds=[1, 0.2, 0.1, 0.05, 0.02]) FourierOperator(6=>64, (16, ), relu), FourierOperator(64=>64, (16, ), relu), FourierOperator(64=>64, (16, ), relu), + FourierOperator(64=>64, (16, ), relu), FourierOperator(64=>6, (16, )), ) |> device @@ -32,10 +40,14 @@ function train(; loss_bounds=[1, 0.2, 0.1, 0.05, 0.02]) data = [(𝐱, 𝐲) for (𝐱, 𝐲) in loader_train] |> device + losses = Float32[] function validate() validation_loss = sum(loss(device(𝐱), device(𝐲)) for (𝐱, 𝐲) in loader_test)/length(loader_test) @info "loss: $validation_loss" + push!(losses, validation_loss) + (losses[end] == minimum(losses)) && update_model!(joinpath(@__DIR__, "../model/model.jld2"), m) + isempty(loss_bounds) && return if validation_loss < loss_bounds[1] @warn "change η" @@ -43,9 +55,9 @@ function train(; loss_bounds=[1, 0.2, 0.1, 0.05, 0.02]) popfirst!(loss_bounds) end end - - call_back = Flux.throttle(validate, 1, leading=false, trailing=true) - Flux.@epochs 300 @time(Flux.train!(loss, params(m), data, opt, cb=call_back)) + call_back = Flux.throttle(validate, 10, leading=false, trailing=true) + + Flux.@epochs 50 @time(Flux.train!(loss, params(m), data, opt, cb=call_back)) end end From 482119acd86d21fc2389196f8b48cbb64b8c5831 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 14/29] fallback to last model --- example/DoublePendulum/src/DoublePendulum.jl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index 5ebe9439..e5c7a1b2 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -15,7 +15,7 @@ function update_model!(model_file_path, model) @warn "model updated!" end -function train(; loss_bounds=[1, 0.3, 0.1, 0.05]) +function train(; loss_bounds=[1, 0.2, 0.1, 0.05, 0.02]) if has_cuda() @info "CUDA is on" device = gpu @@ -28,7 +28,6 @@ function train(; loss_bounds=[1, 0.3, 0.1, 0.05]) FourierOperator(6=>64, (16, ), relu), FourierOperator(64=>64, (16, ), relu), FourierOperator(64=>64, (16, ), relu), - FourierOperator(64=>64, (16, ), relu), FourierOperator(64=>6, (16, )), ) |> device @@ -56,7 +55,7 @@ function train(; loss_bounds=[1, 0.3, 0.1, 0.05]) end end call_back = Flux.throttle(validate, 10, leading=false, trailing=true) - + Flux.@epochs 50 @time(Flux.train!(loss, params(m), data, opt, cb=call_back)) end From a2e1a37891b2b92e535915246729ab4b10e0ec42 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 15/29] train MNO in 2-D and make sure loss<1e-2 about 5e-3 at epoch=35 --- example/DoublePendulum/src/DoublePendulum.jl | 10 +++++----- example/DoublePendulum/src/data.jl | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index e5c7a1b2..84163556 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -15,7 +15,7 @@ function update_model!(model_file_path, model) @warn "model updated!" end -function train(; loss_bounds=[1, 0.2, 0.1, 0.05, 0.02]) +function train(; loss_bounds=[0.05]) if has_cuda() @info "CUDA is on" device = gpu @@ -25,10 +25,10 @@ function train(; loss_bounds=[1, 0.2, 0.1, 0.05, 0.02]) end m = Chain( - FourierOperator(6=>64, (16, ), relu), - FourierOperator(64=>64, (16, ), relu), - FourierOperator(64=>64, (16, ), relu), - FourierOperator(64=>6, (16, )), + FourierOperator(1=>64, (6, 64, ), relu), + FourierOperator(64=>64, (6, 64, ), relu), + FourierOperator(64=>64, (6, 64, ), relu), + FourierOperator(64=>1, (6, 64, )), ) |> device loss(𝐱, 𝐲) = sum(abs2, 𝐲 .- m(𝐱)) / size(𝐱)[end] diff --git a/example/DoublePendulum/src/data.jl b/example/DoublePendulum/src/data.jl index 8a81efde..6bca28c5 100644 --- a/example/DoublePendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -42,12 +42,12 @@ end function get_dataloader(; i=0, n_train=15001, n_test=1501, Δn=1024, batchsize=100) x = reshape(get_double_pendulum_chaotic_data(; i=i, n=-1), :) - 𝐱 = reshape(vcat([x[i:(i+6Δn-1)] for i in 1:6:(length(x)-6(Δn-1))]...), 6, 1024, :) + 𝐱 = reshape(vcat([x[i:(i+6Δn-1)] for i in 1:6:(length(x)-6(Δn-1))]...), 1, 6, 1024, :) - 𝐱_train, 𝐲_train = 𝐱[:, :, 1:(n_train-1)], 𝐱[:, :, 2:n_train] + 𝐱_train, 𝐲_train = 𝐱[:, :, :, 1:(n_train-1)], 𝐱[:, :, :, 2:n_train] loader_train = Flux.DataLoader((𝐱_train, 𝐲_train), batchsize=batchsize, shuffle=true) - 𝐱_test, 𝐲_test = 𝐱[:, :, (end-n_test+1):(end-1)], 𝐱[:, :, (end-n_test+2):end] + 𝐱_test, 𝐲_test = 𝐱[:, :, :, (end-n_test+1):(end-1)], 𝐱[:, :, :, (end-n_test+2):end] loader_test = Flux.DataLoader((𝐱_test, 𝐲_test), batchsize=batchsize, shuffle=false) return loader_train, loader_test From 14ee136e1b82c771a9606956ed502512a44317ba Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 16/29] implement get_model and refactor --- example/DoublePendulum/notebook/data.jl | 2 +- example/DoublePendulum/src/DoublePendulum.jl | 8 ++++++++ example/DoublePendulum/src/data.jl | 6 ++---- example/DoublePendulum/test/data.jl | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/example/DoublePendulum/notebook/data.jl b/example/DoublePendulum/notebook/data.jl index 943411fa..4491feca 100644 --- a/example/DoublePendulum/notebook/data.jl +++ b/example/DoublePendulum/notebook/data.jl @@ -14,7 +14,7 @@ begin end # ╔═╡ 5268feee-bda2-4612-9d4c-a1db424a11c7 -data = get_double_pendulum_chaotic_data(i=0, n=-1) +data = get_data(i=0, n=-1) # ╔═╡ 9c8b3f8a-1b85-4c32-a416-ead51b244b94 begin diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index 84163556..0fbf5450 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -59,4 +59,12 @@ function train(; loss_bounds=[0.05]) Flux.@epochs 50 @time(Flux.train!(loss, params(m), data, opt, cb=call_back)) end +function get_model() + f = jldopen(joinpath(@__DIR__, "../model/model.jld2")) + model = f["model"] + close(f) + + return model +end + end diff --git a/example/DoublePendulum/src/data.jl b/example/DoublePendulum/src/data.jl index 6bca28c5..6688a0f3 100644 --- a/example/DoublePendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -2,8 +2,6 @@ using DataDeps using CSV using DataFrames -export get_double_pendulum_chaotic_data - function register_double_pendulum_chaotic() register(DataDep( "DoublePendulumChaotic", @@ -26,7 +24,7 @@ function register_double_pendulum_chaotic() )) end -function get_double_pendulum_chaotic_data(; i=0, n=-1) +function get_data(; i=0, n=-1) data_path = joinpath(datadep"DoublePendulumChaotic", "original", "dpc_dataset_csv") df = CSV.read( joinpath(data_path, "$i.csv"), @@ -41,7 +39,7 @@ function get_double_pendulum_chaotic_data(; i=0, n=-1) end function get_dataloader(; i=0, n_train=15001, n_test=1501, Δn=1024, batchsize=100) - x = reshape(get_double_pendulum_chaotic_data(; i=i, n=-1), :) + x = reshape(get_data(; i=i, n=-1), :) 𝐱 = reshape(vcat([x[i:(i+6Δn-1)] for i in 1:6:(length(x)-6(Δn-1))]...), 1, 6, 1024, :) 𝐱_train, 𝐲_train = 𝐱[:, :, :, 1:(n_train-1)], 𝐱[:, :, :, 2:n_train] diff --git a/example/DoublePendulum/test/data.jl b/example/DoublePendulum/test/data.jl index 36abad27..6d061565 100644 --- a/example/DoublePendulum/test/data.jl +++ b/example/DoublePendulum/test/data.jl @@ -1,5 +1,5 @@ @testset "double pendulum" begin - xs = get_double_pendulum_chaotic_data(i=0, n=100) + xs = DoublePendulum.get_data(i=0, n=100) @test size(xs) == (6, 100) end From 6b3bb4b8b26468965a9b88dd623b73de68c122c2 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 17/29] result visualization (failed) --- example/DoublePendulum/notebook/data.jl | 53 ++++++++++++++++++++----- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/example/DoublePendulum/notebook/data.jl b/example/DoublePendulum/notebook/data.jl index 4491feca..ab0870cc 100644 --- a/example/DoublePendulum/notebook/data.jl +++ b/example/DoublePendulum/notebook/data.jl @@ -14,25 +14,56 @@ begin end # ╔═╡ 5268feee-bda2-4612-9d4c-a1db424a11c7 -data = get_data(i=0, n=-1) +data = DoublePendulum.get_data(i=0, n=-1)[:, end-2048+1:end] -# ╔═╡ 9c8b3f8a-1b85-4c32-a416-ead51b244b94 +# ╔═╡ 4d0b08a4-8a54-41fd-997f-ad54d4c984cd +m = DoublePendulum.get_model() + +# ╔═╡ 794374ce-6674-481d-8a3b-04db0f32d233 begin - anim = @animate for i in 1:1000 - scatter(legend=false, xlim=(0, 1), ylim=(0, 1)) - scatter!(data[[1, 3, 5], i], data[[2, 4, 6], i], color=[:red, :green, :blue]) - annotate!(0.1, 0.1, text("i=$i", :left)) + n = 10 + + ground_truth_data = 1 .- data[:, 1+n:1024+n] + + inferenced_data = m(reshape(data[:, 1:1024], 1, 6, :, 1)) + for i in 1:n + inferenced_data = m(inferenced_data) end - - gif(anim, fps=10) + inferenced_data = 1 .- reshape(inferenced_data, 6, :) end -# ╔═╡ 4a1ebdfe-2524-4d3e-b4ab-520af315063f +# ╔═╡ 9c8b3f8a-1b85-4c32-a416-ead51b244b94 +begin + anim = @animate for i in 1:4:1024 + scatter(legend=false, xlim=(0, 1), ylim=(-0.5, 1), size=(600, 500)) + scatter!( + inferenced_data[[2, 4, 6], i], inferenced_data[[1, 3, 5], i], + color=[ + RGB([239, 71, 111]/255...), + RGB([6, 214, 160]/255...), + RGB([17, 138, 178]/255...) + ], + markersize=8 + ) + scatter!( + ground_truth_data[[2, 4, 6], i], ground_truth_data[[1, 3, 5], i], + color=[ + RGB([255, 166, 158]/255...), + RGB([184, 242, 230]/255...), + RGB([174, 217, 224]/255...) + ], + markersize=4 + ) + annotate!(0.1, -0.4, text("i=$i", :left)) + end + gif(anim) +end # ╔═╡ Cell order: # ╟─194baef2-0417-11ec-05ab-4527ef614024 # ╠═38c9ced5-dcf8-4e03-ac07-7c435687861b # ╠═5268feee-bda2-4612-9d4c-a1db424a11c7 -# ╠═9c8b3f8a-1b85-4c32-a416-ead51b244b94 -# ╠═4a1ebdfe-2524-4d3e-b4ab-520af315063f +# ╠═4d0b08a4-8a54-41fd-997f-ad54d4c984cd +# ╠═794374ce-6674-481d-8a3b-04db0f32d233 +# ╟─9c8b3f8a-1b85-4c32-a416-ead51b244b94 From 21e04b97650136b9b716a1c3d4bd216d7e2b415e Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 18/29] revise data --- example/DoublePendulum/src/data.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/DoublePendulum/src/data.jl b/example/DoublePendulum/src/data.jl index 6688a0f3..f4ee604b 100644 --- a/example/DoublePendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -38,14 +38,14 @@ function get_data(; i=0, n=-1) return Float32.(data) end -function get_dataloader(; i=0, n_train=15001, n_test=1501, Δn=1024, batchsize=100) - x = reshape(get_data(; i=i, n=-1), :) +function get_dataloader(; i=0, n_train=15734, n_test=2048, Δn=1024, batchsize=100) + x = reshape(get_data(; i=i, n=-1), :) # size==(6, 17782) 𝐱 = reshape(vcat([x[i:(i+6Δn-1)] for i in 1:6:(length(x)-6(Δn-1))]...), 1, 6, 1024, :) - 𝐱_train, 𝐲_train = 𝐱[:, :, :, 1:(n_train-1)], 𝐱[:, :, :, 2:n_train] + 𝐱_train, 𝐲_train = 𝐱[:, :, :, 1:(n_train-Δn)], 𝐱[:, :, :, 1+Δn:n_train] loader_train = Flux.DataLoader((𝐱_train, 𝐲_train), batchsize=batchsize, shuffle=true) - 𝐱_test, 𝐲_test = 𝐱[:, :, :, (end-n_test+1):(end-1)], 𝐱[:, :, :, (end-n_test+2):end] + 𝐱_test, 𝐲_test = 𝐱[:, :, :, (end-n_test+1):(end-Δn)], 𝐱[:, :, :, (end-n_test+1+Δn):end] loader_test = Flux.DataLoader((𝐱_test, 𝐲_test), batchsize=batchsize, shuffle=false) return loader_train, loader_test From a01ffe190b1a086eda2ab751c87b7757d2d45ad3 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 19/29] add gradient --- example/DoublePendulum/src/DoublePendulum.jl | 26 +++++++++++++++----- example/DoublePendulum/src/data.jl | 13 +++++----- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index 0fbf5450..7e2e5f39 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -15,7 +15,7 @@ function update_model!(model_file_path, model) @warn "model updated!" end -function train(; loss_bounds=[0.05]) +function train(; loss_bounds=[]) if has_cuda() @info "CUDA is on" device = gpu @@ -25,15 +25,29 @@ function train(; loss_bounds=[0.05]) end m = Chain( - FourierOperator(1=>64, (6, 64, ), relu), - FourierOperator(64=>64, (6, 64, ), relu), - FourierOperator(64=>64, (6, 64, ), relu), - FourierOperator(64=>1, (6, 64, )), + Dense(1, 64, gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, ), gelu), + FourierOperator(64=>64, (12, )), + Dense(64, 1) ) |> device loss(𝐱, 𝐲) = sum(abs2, 𝐲 .- m(𝐱)) / size(𝐱)[end] - opt = Flux.Optimiser(WeightDecay(1f-4), Flux.ADAM(1f-2)) + opt = Flux.Optimiser(WeightDecay(1f-4), Flux.ADAM(1f-3)) loader_train, loader_test = get_dataloader() diff --git a/example/DoublePendulum/src/data.jl b/example/DoublePendulum/src/data.jl index f4ee604b..b782147c 100644 --- a/example/DoublePendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -33,19 +33,18 @@ function get_data(; i=0, n=-1) ) data = (n < 0) ? collect(Matrix(df)') : collect(Matrix(df)')[:, 1:n] - data /= maximum(data) - return Float32.(data) end -function get_dataloader(; i=0, n_train=15734, n_test=2048, Δn=1024, batchsize=100) - x = reshape(get_data(; i=i, n=-1), :) # size==(6, 17782) - 𝐱 = reshape(vcat([x[i:(i+6Δn-1)] for i in 1:6:(length(x)-6(Δn-1))]...), 1, 6, 1024, :) +function get_dataloader(; i=0, n_train=15733, n_test=2048, Δn=1, batchsize=100) + 𝐱 = get_data(i=i, n=-1) # size==(6, 17782) + ∇𝐱 = 𝐱[:, (1+Δn):end] - 𝐱[:, 1:(end-Δn)] + 𝐱 = reshape(vcat(𝐱[:, 1:(end-Δn)], ∇𝐱), 1, 12, :) - 𝐱_train, 𝐲_train = 𝐱[:, :, :, 1:(n_train-Δn)], 𝐱[:, :, :, 1+Δn:n_train] + 𝐱_train, 𝐲_train = 𝐱[:, :, 1:(n_train-1)], 𝐱[:, :, 2:n_train] loader_train = Flux.DataLoader((𝐱_train, 𝐲_train), batchsize=batchsize, shuffle=true) - 𝐱_test, 𝐲_test = 𝐱[:, :, :, (end-n_test+1):(end-Δn)], 𝐱[:, :, :, (end-n_test+1+Δn):end] + 𝐱_test, 𝐲_test = 𝐱[:, :, (end-n_test+1):(end-1)], 𝐱[:, :, (end-n_test+2):end] loader_test = Flux.DataLoader((𝐱_test, 𝐲_test), batchsize=batchsize, shuffle=false) return loader_train, loader_test From 664b657435e008f9e2f8a72a6c5ccb9ca156498b Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 20/29] resolve conflict on uuid --- example/DoublePendulum/Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/DoublePendulum/Project.toml b/example/DoublePendulum/Project.toml index ab83693b..536be227 100644 --- a/example/DoublePendulum/Project.toml +++ b/example/DoublePendulum/Project.toml @@ -1,5 +1,5 @@ name = "DoublePendulum" -uuid = "1fc04e5d-1dd1-42ff-8d75-1d53504b2476" +uuid = "0c23c1c1-5f41-4617-a685-ac46aae913c3" [deps] CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" From a634b8b1c7bc6a599d57dbc2ddea4f6558c50a6b Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 21/29] after NS model successful --- example/DoublePendulum/notebook/data.jl | 44 +++++++++++--------- example/DoublePendulum/src/DoublePendulum.jl | 37 ++++------------ example/DoublePendulum/src/data.jl | 24 +++++++---- 3 files changed, 49 insertions(+), 56 deletions(-) diff --git a/example/DoublePendulum/notebook/data.jl b/example/DoublePendulum/notebook/data.jl index ab0870cc..5b2420b1 100644 --- a/example/DoublePendulum/notebook/data.jl +++ b/example/DoublePendulum/notebook/data.jl @@ -14,37 +14,41 @@ begin end # ╔═╡ 5268feee-bda2-4612-9d4c-a1db424a11c7 -data = DoublePendulum.get_data(i=0, n=-1)[:, end-2048+1:end] +data, _, _, _ = DoublePendulum.preprocess(DoublePendulum.get_data(i=0), ratio=1); +# data = reshape(DoublePendulum.get_data(; i=0, n=1000), 1, 1, 6, :); # ╔═╡ 4d0b08a4-8a54-41fd-997f-ad54d4c984cd m = DoublePendulum.get_model() # ╔═╡ 794374ce-6674-481d-8a3b-04db0f32d233 begin - n = 10 + n = 100 - ground_truth_data = 1 .- data[:, 1+n:1024+n] + ground_truth_data = data[1, 1, :, 1:n] - inferenced_data = m(reshape(data[:, 1:1024], 1, 6, :, 1)) - for i in 1:n - inferenced_data = m(inferenced_data) - end - inferenced_data = 1 .- reshape(inferenced_data, 6, :) + # inferenced_data = m(reshape(data[:, 1:1024], 1, 6, :, 1)) + # for i in 1:n + # inferenced_data = m(inferenced_data) + # end + # inferenced_data = 1 .- reshape(inferenced_data, 6, :) end # ╔═╡ 9c8b3f8a-1b85-4c32-a416-ead51b244b94 begin - anim = @animate for i in 1:4:1024 - scatter(legend=false, xlim=(0, 1), ylim=(-0.5, 1), size=(600, 500)) - scatter!( - inferenced_data[[2, 4, 6], i], inferenced_data[[1, 3, 5], i], - color=[ - RGB([239, 71, 111]/255...), - RGB([6, 214, 160]/255...), - RGB([17, 138, 178]/255...) - ], - markersize=8 + anim = @animate for i in 1:n + scatter( + legend=false, ticks=false, + xlim=(0, 2500), ylim=(0, 2500), size=(600, 500) ) + # scatter!( + # inferenced_data[[2, 4, 6], i], inferenced_data[[1, 3, 5], i], + # color=[ + # RGB([239, 71, 111]/255...), + # RGB([6, 214, 160]/255...), + # RGB([17, 138, 178]/255...) + # ], + # markersize=8 + # ) scatter!( ground_truth_data[[2, 4, 6], i], ground_truth_data[[1, 3, 5], i], color=[ @@ -54,7 +58,7 @@ begin ], markersize=4 ) - annotate!(0.1, -0.4, text("i=$i", :left)) + annotate!(50, 50, text("t=$i", :left)) end gif(anim) @@ -66,4 +70,4 @@ end # ╠═5268feee-bda2-4612-9d4c-a1db424a11c7 # ╠═4d0b08a4-8a54-41fd-997f-ad54d4c984cd # ╠═794374ce-6674-481d-8a3b-04db0f32d233 -# ╟─9c8b3f8a-1b85-4c32-a416-ead51b244b94 +# ╠═9c8b3f8a-1b85-4c32-a416-ead51b244b94 diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index 7e2e5f39..ac02772e 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -15,7 +15,7 @@ function update_model!(model_file_path, model) @warn "model updated!" end -function train(; loss_bounds=[]) +function train(; Δt=2) if has_cuda() @info "CUDA is on" device = gpu @@ -25,33 +25,18 @@ function train(; loss_bounds=[]) end m = Chain( - Dense(1, 64, gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, ), gelu), - FourierOperator(64=>64, (12, )), - Dense(64, 1) + Dense(1, 350), # (1, 2, 6, :) -> (350, 2, 6, :) + x -> reshape(x, 1, 60, 70, :), # (350, 2, 6, :) -> (1, 60, 70, :) + MarkovNeuralOperator(), + x -> reshape(x, 350, 2, 6, :), # (1, 60, 70, :) -> (350, 2, 6, :) + Dense(350, 1), # (350, 2, 6, :) -> (1, 2, 6, :) ) |> device loss(𝐱, 𝐲) = sum(abs2, 𝐲 .- m(𝐱)) / size(𝐱)[end] opt = Flux.Optimiser(WeightDecay(1f-4), Flux.ADAM(1f-3)) - loader_train, loader_test = get_dataloader() - - data = [(𝐱, 𝐲) for (𝐱, 𝐲) in loader_train] |> device + loader_train, loader_test = get_dataloader(Δt=Δt) losses = Float32[] function validate() @@ -60,16 +45,10 @@ function train(; loss_bounds=[]) push!(losses, validation_loss) (losses[end] == minimum(losses)) && update_model!(joinpath(@__DIR__, "../model/model.jld2"), m) - - isempty(loss_bounds) && return - if validation_loss < loss_bounds[1] - @warn "change η" - opt.os[2].eta /= 2 - popfirst!(loss_bounds) - end end call_back = Flux.throttle(validate, 10, leading=false, trailing=true) + data = [(𝐱, 𝐲) for (𝐱, 𝐲) in loader_train] |> device Flux.@epochs 50 @time(Flux.train!(loss, params(m), data, opt, cb=call_back)) end diff --git a/example/DoublePendulum/src/data.jl b/example/DoublePendulum/src/data.jl index b782147c..15322184 100644 --- a/example/DoublePendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -36,15 +36,25 @@ function get_data(; i=0, n=-1) return Float32.(data) end -function get_dataloader(; i=0, n_train=15733, n_test=2048, Δn=1, batchsize=100) - 𝐱 = get_data(i=i, n=-1) # size==(6, 17782) - ∇𝐱 = 𝐱[:, (1+Δn):end] - 𝐱[:, 1:(end-Δn)] - 𝐱 = reshape(vcat(𝐱[:, 1:(end-Δn)], ∇𝐱), 1, 12, :) +function preprocess(𝐱; Δt=2, ratio=0.9) + 𝐱 = reshape(𝐱[:, 1:Δt:end], 1, 1, 6, :) + ∇𝐱 = 𝐱[:, :, :, 2:end] - 𝐱[:, :, :, 1:(end-1)] - 𝐱_train, 𝐲_train = 𝐱[:, :, 1:(n_train-1)], 𝐱[:, :, 2:n_train] - loader_train = Flux.DataLoader((𝐱_train, 𝐲_train), batchsize=batchsize, shuffle=true) + 𝐱 = cat(𝐱[:, :, :, 1:(end-1)], ∇𝐱, dims=2) + + n_train, n_test = floor(Int, ratio*size(𝐱)[end]), floor(Int, (1-ratio)*size(𝐱)[end]) - 𝐱_test, 𝐲_test = 𝐱[:, :, (end-n_test+1):(end-1)], 𝐱[:, :, (end-n_test+2):end] + 𝐱_train, 𝐲_train = 𝐱[:, :, :, 1:(n_train-1)], 𝐱[:, :, :, 2:n_train] + 𝐱_test, 𝐲_test = 𝐱[:, :, :, (end-n_test+1):(end-1)], 𝐱[:, :, :, (end-n_test+2):end] + + return 𝐱_train, 𝐲_train, 𝐱_test, 𝐲_test +end + +function get_dataloader(; i=0, Δt=2, ratio=0.9, batchsize=100) + 𝐱 = get_data(i=i) # size==(6, :) + 𝐱_train, 𝐲_train, 𝐱_test, 𝐲_test = preprocess(𝐱, Δt=Δt, ratio=ratio) # size==(1, 2, 6, :) + + loader_train = Flux.DataLoader((𝐱_train, 𝐲_train), batchsize=batchsize, shuffle=true) loader_test = Flux.DataLoader((𝐱_test, 𝐲_test), batchsize=batchsize, shuffle=false) return loader_train, loader_test From 5ed18041072afc8534cadfda7e4cebdb7a16722c Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 22/29] revise data --- example/DoublePendulum/notebook/data.jl | 73 --------------- .../notebook/double_pendulum.jl | 88 +++++++++++++++++++ example/DoublePendulum/src/DoublePendulum.jl | 8 +- example/DoublePendulum/src/data.jl | 26 ++++-- 4 files changed, 110 insertions(+), 85 deletions(-) delete mode 100644 example/DoublePendulum/notebook/data.jl create mode 100644 example/DoublePendulum/notebook/double_pendulum.jl diff --git a/example/DoublePendulum/notebook/data.jl b/example/DoublePendulum/notebook/data.jl deleted file mode 100644 index 5b2420b1..00000000 --- a/example/DoublePendulum/notebook/data.jl +++ /dev/null @@ -1,73 +0,0 @@ -### A Pluto.jl notebook ### -# v0.15.1 - -using Markdown -using InteractiveUtils - -# ╔═╡ 194baef2-0417-11ec-05ab-4527ef614024 -using Pkg; Pkg.develop(path=".."); Pkg.activate("..") - -# ╔═╡ 38c9ced5-dcf8-4e03-ac07-7c435687861b -begin - using DoublePendulum - using Plots -end - -# ╔═╡ 5268feee-bda2-4612-9d4c-a1db424a11c7 -data, _, _, _ = DoublePendulum.preprocess(DoublePendulum.get_data(i=0), ratio=1); -# data = reshape(DoublePendulum.get_data(; i=0, n=1000), 1, 1, 6, :); - -# ╔═╡ 4d0b08a4-8a54-41fd-997f-ad54d4c984cd -m = DoublePendulum.get_model() - -# ╔═╡ 794374ce-6674-481d-8a3b-04db0f32d233 -begin - n = 100 - - ground_truth_data = data[1, 1, :, 1:n] - - # inferenced_data = m(reshape(data[:, 1:1024], 1, 6, :, 1)) - # for i in 1:n - # inferenced_data = m(inferenced_data) - # end - # inferenced_data = 1 .- reshape(inferenced_data, 6, :) -end - -# ╔═╡ 9c8b3f8a-1b85-4c32-a416-ead51b244b94 -begin - anim = @animate for i in 1:n - scatter( - legend=false, ticks=false, - xlim=(0, 2500), ylim=(0, 2500), size=(600, 500) - ) - # scatter!( - # inferenced_data[[2, 4, 6], i], inferenced_data[[1, 3, 5], i], - # color=[ - # RGB([239, 71, 111]/255...), - # RGB([6, 214, 160]/255...), - # RGB([17, 138, 178]/255...) - # ], - # markersize=8 - # ) - scatter!( - ground_truth_data[[2, 4, 6], i], ground_truth_data[[1, 3, 5], i], - color=[ - RGB([255, 166, 158]/255...), - RGB([184, 242, 230]/255...), - RGB([174, 217, 224]/255...) - ], - markersize=4 - ) - annotate!(50, 50, text("t=$i", :left)) - end - - gif(anim) -end - -# ╔═╡ Cell order: -# ╟─194baef2-0417-11ec-05ab-4527ef614024 -# ╠═38c9ced5-dcf8-4e03-ac07-7c435687861b -# ╠═5268feee-bda2-4612-9d4c-a1db424a11c7 -# ╠═4d0b08a4-8a54-41fd-997f-ad54d4c984cd -# ╠═794374ce-6674-481d-8a3b-04db0f32d233 -# ╠═9c8b3f8a-1b85-4c32-a416-ead51b244b94 diff --git a/example/DoublePendulum/notebook/double_pendulum.jl b/example/DoublePendulum/notebook/double_pendulum.jl new file mode 100644 index 00000000..a6db3bce --- /dev/null +++ b/example/DoublePendulum/notebook/double_pendulum.jl @@ -0,0 +1,88 @@ +### A Pluto.jl notebook ### +# v0.15.1 + +using Markdown +using InteractiveUtils + +# ╔═╡ 194baef2-0417-11ec-05ab-4527ef614024 +using Pkg; Pkg.develop(path=".."); Pkg.activate("..") + +# ╔═╡ 38c9ced5-dcf8-4e03-ac07-7c435687861b +begin + using DoublePendulum + using Plots +end + +# ╔═╡ 396b5d7a-a7a4-4f22-a87e-39b405e8d62a +md" +# Double Pendulum + +JingYu Ning +" + +# ╔═╡ 2a606ecf-acf0-41ad-9290-7569dbb22b5a +md" +The data is provided by [IBM](https://developer.ibm.com/exchanges/data/all/double-pendulum-chaotic/) + +> In this dataset, videos of the double pendulum were taken using a high-speed Phantom Miro EX2 camera. To make the extraction of the arm positions easier, a matte black background was used, and the three datums were marked with red, green and blue fiducial markers. The camera was placed at 2 meters from the pendulum, with the axis of the objective aligned with the first pendulum datum. The pendulum was launched by hand, and the camera was motion triggered. The dataset was generated on the basis of 21 individual runs of the pendulum. Each of the recorded sequences lasted around 40s and consisted of around 17500 frames. +" + +# ╔═╡ 5268feee-bda2-4612-9d4c-a1db424a11c7 +data, _, _, _ = DoublePendulum.preprocess( + DoublePendulum.get_data(i=10, n=410), + ratio=1 +); + +# ╔═╡ 4d0b08a4-8a54-41fd-997f-ad54d4c984cd +m = DoublePendulum.get_model(); + +# ╔═╡ 794374ce-6674-481d-8a3b-04db0f32d233 +begin + n = 20 + + ground_truth_data = data[1, :, 1:n] + + inferenced_data = Array{Float32}(undef, 2, 4, n) + inferenced_data[:, :, 1] .= data[:, :, 1] + for i in 2:n + inferenced_data[:, :, i:i] .= m(inferenced_data[:, :, i-1:i-1]) + end + inferenced_data = inferenced_data[1, :, :] +end; + +# ╔═╡ 9c8b3f8a-1b85-4c32-a416-ead51b244b94 +begin + c = [ + RGB([239, 71, 111]/255...), + RGB([6, 214, 160]/255...), + RGB([17, 138, 178]/255...) + ] + xi, yi = [2, 4, 6], [1, 3, 5] + + anim = @animate for i in 1:n + i_data = [0, 0, inferenced_data[:, i]...] + g_data = [0, 0, ground_truth_data[:, i]...] + + scatter( + legend=false, ticks=false, + xlim=(-1000, 1000), ylim=(-1000, 1000), size=(400, 350) + ) + plot!(i_data[xi], i_data[yi], color=:black) + scatter!(i_data[xi], i_data[yi], color=c, markersize=8) + plot!(g_data[xi], g_data[yi], color=:gray) + scatter!(g_data[xi], g_data[yi], color=c, markersize=4) + annotate!(-900, -900, text("t=$i", :left)) + end + + gif(anim, fps=5) +end + +# ╔═╡ Cell order: +# ╟─396b5d7a-a7a4-4f22-a87e-39b405e8d62a +# ╟─2a606ecf-acf0-41ad-9290-7569dbb22b5a +# ╟─194baef2-0417-11ec-05ab-4527ef614024 +# ╠═38c9ced5-dcf8-4e03-ac07-7c435687861b +# ╠═5268feee-bda2-4612-9d4c-a1db424a11c7 +# ╠═4d0b08a4-8a54-41fd-997f-ad54d4c984cd +# ╠═794374ce-6674-481d-8a3b-04db0f32d233 +# ╟─9c8b3f8a-1b85-4c32-a416-ead51b244b94 diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index ac02772e..7218b99f 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -25,11 +25,11 @@ function train(; Δt=2) end m = Chain( - Dense(1, 350), # (1, 2, 6, :) -> (350, 2, 6, :) - x -> reshape(x, 1, 60, 70, :), # (350, 2, 6, :) -> (1, 60, 70, :) + Dense(2, Int(4096/4)), + x -> reshape(x, 1, 64, 64, :), MarkovNeuralOperator(), - x -> reshape(x, 350, 2, 6, :), # (1, 60, 70, :) -> (350, 2, 6, :) - Dense(350, 1), # (350, 2, 6, :) -> (1, 2, 6, :) + x -> reshape(x, Int(4096/4), 4, :), + Dense(Int(4096/4), 2), ) |> device loss(𝐱, 𝐲) = sum(abs2, 𝐲 .- m(𝐱)) / size(𝐱)[end] diff --git a/example/DoublePendulum/src/data.jl b/example/DoublePendulum/src/data.jl index 15322184..497e0a71 100644 --- a/example/DoublePendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -37,22 +37,32 @@ function get_data(; i=0, n=-1) end function preprocess(𝐱; Δt=2, ratio=0.9) - 𝐱 = reshape(𝐱[:, 1:Δt:end], 1, 1, 6, :) - ∇𝐱 = 𝐱[:, :, :, 2:end] - 𝐱[:, :, :, 1:(end-1)] + xs_red, ys_red = 𝐱[1, :], 𝐱[2, :] + 𝐱[1, :] -= xs_red; 𝐱[3, :] -= xs_red; 𝐱[5, :] -= xs_red + 𝐱[2, :] -= ys_red; 𝐱[4, :] -= ys_red; 𝐱[6, :] -= ys_red - 𝐱 = cat(𝐱[:, :, :, 1:(end-1)], ∇𝐱, dims=2) + 𝐱 = reshape(𝐱[3:6, 1:Δt:end], 1, 4, :) + ∇𝐱 = 𝐱[:, :, 2:end] - 𝐱[:, :, 1:(end-1)] + + 𝐱 = cat(𝐱[:, :, 1:(end-1)], ∇𝐱, dims=1) n_train, n_test = floor(Int, ratio*size(𝐱)[end]), floor(Int, (1-ratio)*size(𝐱)[end]) - 𝐱_train, 𝐲_train = 𝐱[:, :, :, 1:(n_train-1)], 𝐱[:, :, :, 2:n_train] - 𝐱_test, 𝐲_test = 𝐱[:, :, :, (end-n_test+1):(end-1)], 𝐱[:, :, :, (end-n_test+2):end] + 𝐱_train, 𝐲_train = 𝐱[:, :, 1:(n_train-1)], 𝐱[:, :, 2:n_train] + 𝐱_test, 𝐲_test = 𝐱[:, :, (end-n_test+1):(end-1)], 𝐱[:, :, (end-n_test+2):end] return 𝐱_train, 𝐲_train, 𝐱_test, 𝐲_test end -function get_dataloader(; i=0, Δt=2, ratio=0.9, batchsize=100) - 𝐱 = get_data(i=i) # size==(6, :) - 𝐱_train, 𝐲_train, 𝐱_test, 𝐲_test = preprocess(𝐱, Δt=Δt, ratio=ratio) # size==(1, 2, 6, :) +function get_dataloader(; n_file=10, Δt=2, ratio=0.9, batchsize=100) + 𝐱_train, 𝐲_train = Array{Float32}(undef, 2, 4, 0), Array{Float32}(undef, 2, 4, 0) + 𝐱_test, 𝐲_test = Array{Float32}(undef, 2, 4, 0), Array{Float32}(undef, 2, 4, 0) + for i in 0:(n_file-1) + 𝐱_train_i, 𝐲_train_i, 𝐱_test_i, 𝐲_test_i = preprocess(get_data(i=i), Δt=Δt, ratio=ratio) + + 𝐱_train, 𝐲_train = cat(𝐱_train, 𝐱_train_i, dims=3), cat(𝐲_train, 𝐲_train_i, dims=3) + 𝐱_test, 𝐲_test = cat(𝐱_test, 𝐱_test_i, dims=3), cat(𝐲_test, 𝐲_test_i, dims=3) + end loader_train = Flux.DataLoader((𝐱_train, 𝐲_train), batchsize=batchsize, shuffle=true) loader_test = Flux.DataLoader((𝐱_test, 𝐲_test), batchsize=batchsize, shuffle=false) From 35f9354ecc04fa5fc873dada6b9f712ee3473eb2 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Wed, 1 Sep 2021 02:39:38 +0800 Subject: [PATCH 23/29] use all data --- .../DoublePendulum/notebook/double_pendulum.jl | 16 ++++++++-------- example/DoublePendulum/src/DoublePendulum.jl | 6 +++++- example/DoublePendulum/src/data.jl | 9 ++++++--- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/example/DoublePendulum/notebook/double_pendulum.jl b/example/DoublePendulum/notebook/double_pendulum.jl index a6db3bce..eee33d50 100644 --- a/example/DoublePendulum/notebook/double_pendulum.jl +++ b/example/DoublePendulum/notebook/double_pendulum.jl @@ -29,7 +29,7 @@ The data is provided by [IBM](https://developer.ibm.com/exchanges/data/all/doubl # ╔═╡ 5268feee-bda2-4612-9d4c-a1db424a11c7 data, _, _, _ = DoublePendulum.preprocess( - DoublePendulum.get_data(i=10, n=410), + DoublePendulum.get_data(i=20, n=410), ratio=1 ); @@ -39,9 +39,9 @@ m = DoublePendulum.get_model(); # ╔═╡ 794374ce-6674-481d-8a3b-04db0f32d233 begin n = 20 - + ground_truth_data = data[1, :, 1:n] - + inferenced_data = Array{Float32}(undef, 2, 4, n) inferenced_data[:, :, 1] .= data[:, :, 1] for i in 2:n @@ -53,18 +53,18 @@ end; # ╔═╡ 9c8b3f8a-1b85-4c32-a416-ead51b244b94 begin c = [ - RGB([239, 71, 111]/255...), - RGB([6, 214, 160]/255...), + RGB([239, 71, 111]/255...), + RGB([6, 214, 160]/255...), RGB([17, 138, 178]/255...) ] xi, yi = [2, 4, 6], [1, 3, 5] - + anim = @animate for i in 1:n i_data = [0, 0, inferenced_data[:, i]...] g_data = [0, 0, ground_truth_data[:, i]...] - + scatter( - legend=false, ticks=false, + legend=false, ticks=false, xlim=(-1000, 1000), ylim=(-1000, 1000), size=(400, 350) ) plot!(i_data[xi], i_data[yi], color=:black) diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index 7218b99f..d7795224 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -49,7 +49,11 @@ function train(; Δt=2) call_back = Flux.throttle(validate, 10, leading=false, trailing=true) data = [(𝐱, 𝐲) for (𝐱, 𝐲) in loader_train] |> device - Flux.@epochs 50 @time(Flux.train!(loss, params(m), data, opt, cb=call_back)) + for e in 1:50 + @info "Epoch $e" + @time Flux.train!(loss, params(m), data, opt, cb=call_back) + (e%3 == 0) && (opt.os[2].eta /= 2) + end end function get_model() diff --git a/example/DoublePendulum/src/data.jl b/example/DoublePendulum/src/data.jl index 497e0a71..f1b3020f 100644 --- a/example/DoublePendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -37,11 +37,14 @@ function get_data(; i=0, n=-1) end function preprocess(𝐱; Δt=2, ratio=0.9) + # move red point to (0, 0) xs_red, ys_red = 𝐱[1, :], 𝐱[2, :] - 𝐱[1, :] -= xs_red; 𝐱[3, :] -= xs_red; 𝐱[5, :] -= xs_red - 𝐱[2, :] -= ys_red; 𝐱[4, :] -= ys_red; 𝐱[6, :] -= ys_red + 𝐱[3, :] -= xs_red; 𝐱[5, :] -= xs_red + 𝐱[4, :] -= ys_red; 𝐱[6, :] -= ys_red + # needs only green and blue points 𝐱 = reshape(𝐱[3:6, 1:Δt:end], 1, 4, :) + # velocity of green and blue points ∇𝐱 = 𝐱[:, :, 2:end] - 𝐱[:, :, 1:(end-1)] 𝐱 = cat(𝐱[:, :, 1:(end-1)], ∇𝐱, dims=1) @@ -54,7 +57,7 @@ function preprocess(𝐱; Δt=2, ratio=0.9) return 𝐱_train, 𝐲_train, 𝐱_test, 𝐲_test end -function get_dataloader(; n_file=10, Δt=2, ratio=0.9, batchsize=100) +function get_dataloader(; n_file=20, Δt=2, ratio=0.9, batchsize=100) 𝐱_train, 𝐲_train = Array{Float32}(undef, 2, 4, 0), Array{Float32}(undef, 2, 4, 0) 𝐱_test, 𝐲_test = Array{Float32}(undef, 2, 4, 0), Array{Float32}(undef, 2, 4, 0) for i in 0:(n_file-1) From 4b9faf9d999589e4bede13047f48058ef4cdafe7 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Sun, 12 Sep 2021 16:53:19 +0800 Subject: [PATCH 24/29] train task via 2-D NFO --- .../notebook/double_pendulum.jl | 49 ++++++++++++------- example/DoublePendulum/src/DoublePendulum.jl | 18 ++++--- example/DoublePendulum/src/data.jl | 30 +++++++----- 3 files changed, 61 insertions(+), 36 deletions(-) diff --git a/example/DoublePendulum/notebook/double_pendulum.jl b/example/DoublePendulum/notebook/double_pendulum.jl index eee33d50..8ab52ba2 100644 --- a/example/DoublePendulum/notebook/double_pendulum.jl +++ b/example/DoublePendulum/notebook/double_pendulum.jl @@ -1,5 +1,5 @@ ### A Pluto.jl notebook ### -# v0.15.1 +# v0.16.0 using Markdown using InteractiveUtils @@ -28,26 +28,35 @@ The data is provided by [IBM](https://developer.ibm.com/exchanges/data/all/doubl " # ╔═╡ 5268feee-bda2-4612-9d4c-a1db424a11c7 -data, _, _, _ = DoublePendulum.preprocess( - DoublePendulum.get_data(i=20, n=410), +data_x, data_y, _, _ = DoublePendulum.preprocess( + DoublePendulum.get_data(i=20), ratio=1 ); # ╔═╡ 4d0b08a4-8a54-41fd-997f-ad54d4c984cd m = DoublePendulum.get_model(); -# ╔═╡ 794374ce-6674-481d-8a3b-04db0f32d233 -begin - n = 20 - - ground_truth_data = data[1, :, 1:n] +# ╔═╡ ad6302b2-3d62-4a3f-b8bf-f69bab80c7a4 +ground_truth_data = cat( + [data_x[:, :, :, i] + for i in 1:size(data_x, 3):size(data_x)[end]]..., dims=3 +)[1, :, :]; - inferenced_data = Array{Float32}(undef, 2, 4, n) - inferenced_data[:, :, 1] .= data[:, :, 1] - for i in 2:n - inferenced_data[:, :, i:i] .= m(inferenced_data[:, :, i-1:i-1]) +# ╔═╡ 794374ce-6674-481d-8a3b-04db0f32d233 +begin + n = 5 + inferenced_data = data_x[:, :, :, 1:1] + for i in 1:n + inferenced_data = cat( + inferenced_data, + m(inferenced_data[:, :, :, i:i]), + dims=4 + ) end - inferenced_data = inferenced_data[1, :, :] + + inferenced_data = cat( + [inferenced_data[:, :, :, i] for i in 1:n]..., dims=3 + )[1, :, :] end; # ╔═╡ 9c8b3f8a-1b85-4c32-a416-ead51b244b94 @@ -59,22 +68,27 @@ begin ] xi, yi = [2, 4, 6], [1, 3, 5] - anim = @animate for i in 1:n + anim = @animate for i in 1:size(inferenced_data)[end] i_data = [0, 0, inferenced_data[:, i]...] g_data = [0, 0, ground_truth_data[:, i]...] scatter( legend=false, ticks=false, - xlim=(-1000, 1000), ylim=(-1000, 1000), size=(400, 350) + xlim=(-1500, 1500), ylim=(-1500, 1500), size=(400, 350) ) plot!(i_data[xi], i_data[yi], color=:black) scatter!(i_data[xi], i_data[yi], color=c, markersize=8) plot!(g_data[xi], g_data[yi], color=:gray) scatter!(g_data[xi], g_data[yi], color=c, markersize=4) - annotate!(-900, -900, text("t=$i", :left)) + + if i ≤ 30 + annotate!(-1400, -1400, text("t=$i", :left, color=:black)) + else + annotate!(-1400, -1400, text("t=$i", :left, color=:red)) + end end - gif(anim, fps=5) + gif(anim) end # ╔═╡ Cell order: @@ -84,5 +98,6 @@ end # ╠═38c9ced5-dcf8-4e03-ac07-7c435687861b # ╠═5268feee-bda2-4612-9d4c-a1db424a11c7 # ╠═4d0b08a4-8a54-41fd-997f-ad54d4c984cd +# ╠═ad6302b2-3d62-4a3f-b8bf-f69bab80c7a4 # ╠═794374ce-6674-481d-8a3b-04db0f32d233 # ╟─9c8b3f8a-1b85-4c32-a416-ead51b244b94 diff --git a/example/DoublePendulum/src/DoublePendulum.jl b/example/DoublePendulum/src/DoublePendulum.jl index d7795224..b0e687b0 100644 --- a/example/DoublePendulum/src/DoublePendulum.jl +++ b/example/DoublePendulum/src/DoublePendulum.jl @@ -15,7 +15,7 @@ function update_model!(model_file_path, model) @warn "model updated!" end -function train(; Δt=2) +function train(; Δt=1) if has_cuda() @info "CUDA is on" device = gpu @@ -25,11 +25,13 @@ function train(; Δt=2) end m = Chain( - Dense(2, Int(4096/4)), - x -> reshape(x, 1, 64, 64, :), - MarkovNeuralOperator(), - x -> reshape(x, Int(4096/4), 4, :), - Dense(Int(4096/4), 2), + Dense(2, 64), + FourierOperator(64=>64, (4, 16), gelu), + FourierOperator(64=>64, (4, 16), gelu), + FourierOperator(64=>64, (4, 16), gelu), + FourierOperator(64=>64, (4, 16)), + Dense(64, 128, gelu), + Dense(128, 2), ) |> device loss(𝐱, 𝐲) = sum(abs2, 𝐲 .- m(𝐱)) / size(𝐱)[end] @@ -49,8 +51,8 @@ function train(; Δt=2) call_back = Flux.throttle(validate, 10, leading=false, trailing=true) data = [(𝐱, 𝐲) for (𝐱, 𝐲) in loader_train] |> device - for e in 1:50 - @info "Epoch $e" + for e in 1:20 + @info "Epoch $e\n η: $(opt.os[2].eta)" @time Flux.train!(loss, params(m), data, opt, cb=call_back) (e%3 == 0) && (opt.os[2].eta /= 2) end diff --git a/example/DoublePendulum/src/data.jl b/example/DoublePendulum/src/data.jl index f1b3020f..96f60b26 100644 --- a/example/DoublePendulum/src/data.jl +++ b/example/DoublePendulum/src/data.jl @@ -36,7 +36,7 @@ function get_data(; i=0, n=-1) return Float32.(data) end -function preprocess(𝐱; Δt=2, ratio=0.9) +function preprocess(𝐱; Δt=1, nx=30, ny=30, ratio=0.9) # move red point to (0, 0) xs_red, ys_red = 𝐱[1, :], 𝐱[2, :] 𝐱[3, :] -= xs_red; 𝐱[5, :] -= xs_red @@ -46,25 +46,33 @@ function preprocess(𝐱; Δt=2, ratio=0.9) 𝐱 = reshape(𝐱[3:6, 1:Δt:end], 1, 4, :) # velocity of green and blue points ∇𝐱 = 𝐱[:, :, 2:end] - 𝐱[:, :, 1:(end-1)] - + # merge info of pos and velocity 𝐱 = cat(𝐱[:, :, 1:(end-1)], ∇𝐱, dims=1) - n_train, n_test = floor(Int, ratio*size(𝐱)[end]), floor(Int, (1-ratio)*size(𝐱)[end]) + # with info of first nx steps to inference next ny steps + n = size(𝐱)[end] - (nx + ny) + 1 + 𝐱s = Array{Float32}(undef, size(𝐱)[1:2]..., nx, n) + 𝐲s = Array{Float32}(undef, size(𝐱)[1:2]..., ny, n) + for i in 1:n + 𝐱s[:, :, :, i] .= 𝐱[:, :, i:(i+nx-1)] + 𝐲s[:, :, :, i] .= 𝐱[:, :, (i+nx):(i+nx+ny-1)] + end - 𝐱_train, 𝐲_train = 𝐱[:, :, 1:(n_train-1)], 𝐱[:, :, 2:n_train] - 𝐱_test, 𝐲_test = 𝐱[:, :, (end-n_test+1):(end-1)], 𝐱[:, :, (end-n_test+2):end] + n_train = floor(Int, ratio*n) + 𝐱_train, 𝐲_train = 𝐱s[:, :, :, 1:n_train], 𝐲s[:, :, :, 1:n_train] + 𝐱_test, 𝐲_test = 𝐱s[:, :, :, (n_train+1):end], 𝐲s[:, :, :, (n_train+1):end] return 𝐱_train, 𝐲_train, 𝐱_test, 𝐲_test end -function get_dataloader(; n_file=20, Δt=2, ratio=0.9, batchsize=100) - 𝐱_train, 𝐲_train = Array{Float32}(undef, 2, 4, 0), Array{Float32}(undef, 2, 4, 0) - 𝐱_test, 𝐲_test = Array{Float32}(undef, 2, 4, 0), Array{Float32}(undef, 2, 4, 0) +function get_dataloader(; n_file=20, Δt=1, nx=30, ny=30, ratio=0.9, batchsize=100) + 𝐱_train, 𝐲_train = Array{Float32}(undef, 2, 4, nx, 0), Array{Float32}(undef, 2, 4, ny, 0) + 𝐱_test, 𝐲_test = Array{Float32}(undef, 2, 4, nx, 0), Array{Float32}(undef, 2, 4, ny, 0) for i in 0:(n_file-1) - 𝐱_train_i, 𝐲_train_i, 𝐱_test_i, 𝐲_test_i = preprocess(get_data(i=i), Δt=Δt, ratio=ratio) + 𝐱_train_i, 𝐲_train_i, 𝐱_test_i, 𝐲_test_i = preprocess(get_data(i=i), Δt=Δt, nx=nx, ny=ny, ratio=ratio) - 𝐱_train, 𝐲_train = cat(𝐱_train, 𝐱_train_i, dims=3), cat(𝐲_train, 𝐲_train_i, dims=3) - 𝐱_test, 𝐲_test = cat(𝐱_test, 𝐱_test_i, dims=3), cat(𝐲_test, 𝐲_test_i, dims=3) + 𝐱_train, 𝐲_train = cat(𝐱_train, 𝐱_train_i, dims=4), cat(𝐲_train, 𝐲_train_i, dims=4) + 𝐱_test, 𝐲_test = cat(𝐱_test, 𝐱_test_i, dims=4), cat(𝐲_test, 𝐲_test_i, dims=4) end loader_train = Flux.DataLoader((𝐱_train, 𝐲_train), batchsize=batchsize, shuffle=true) From 14a9c4f1dab2d9c41b8989e65990824fbb168a40 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Sun, 12 Sep 2021 16:56:21 +0800 Subject: [PATCH 25/29] add notebook and gallery --- .../assets/notebook/double_pendulum.jl.html | 75 ++++++++++++++++++ example/DoublePendulum/gallery/result.gif | Bin 0 -> 210257 bytes 2 files changed, 75 insertions(+) create mode 100644 docs/src/assets/notebook/double_pendulum.jl.html create mode 100644 example/DoublePendulum/gallery/result.gif diff --git a/docs/src/assets/notebook/double_pendulum.jl.html b/docs/src/assets/notebook/double_pendulum.jl.html new file mode 100644 index 00000000..bfc40b25 --- /dev/null +++ b/docs/src/assets/notebook/double_pendulum.jl.html @@ -0,0 +1,75 @@ + + + + + + ⚡ Pluto.jl ⚡ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/example/DoublePendulum/gallery/result.gif b/example/DoublePendulum/gallery/result.gif new file mode 100644 index 0000000000000000000000000000000000000000..599f0255b4cec15b967bddca781e1fa925577bb9 GIT binary patch literal 210257 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ȥ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 d Date: Sun, 12 Sep 2021 17:06:12 +0800 Subject: [PATCH 26/29] readme for Burgers' equation --- README.md | 11 ++--------- example/Burgers/README.md | 11 +++++++++++ 2 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 example/Burgers/README.md diff --git a/README.md b/README.md index 7c47023e..a558d1fb 100644 --- a/README.md +++ b/README.md @@ -70,16 +70,9 @@ Flux.@epochs 50 Flux.train!(loss, params(model), data, opt) PDE training examples are provided in `example` folder. -### One-dimensional Burgers' equation +### One-dimensional -[Burgers' equation](https://en.wikipedia.org/wiki/Burgers%27_equation) example can be found in `example/Burgers`. -Use following commend to train model: - -```julia -$ julia --proj - -julia> using Burgers; Burgers.train() -``` +[Burgers' equation](example/Burgers) ### Two-dimensional with time Navier-Stokes equation diff --git a/example/Burgers/README.md b/example/Burgers/README.md new file mode 100644 index 00000000..5dbf8bd3 --- /dev/null +++ b/example/Burgers/README.md @@ -0,0 +1,11 @@ +# Burgers' equation + +In this example, a [Burgers' equation](https://en.wikipedia.org/wiki/Burgers%27_equation) +is learned by a one-dimensional Fourier neural operator network. +Change directory to `example/Burgers` and use following commend to train model: + +```julia +$ julia --proj + +julia> using Burgers; Burgers.train() +``` From fea3108f720404014b97947bc87920c0c0fac1eb Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Sun, 12 Sep 2021 17:14:02 +0800 Subject: [PATCH 27/29] readme for FlowOverCircle --- README.md | 18 +++--------------- example/FlowOverCircle/README.md | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 15 deletions(-) create mode 100644 example/FlowOverCircle/README.md diff --git a/README.md b/README.md index a558d1fb..10f0fd8a 100644 --- a/README.md +++ b/README.md @@ -70,27 +70,15 @@ Flux.@epochs 50 Flux.train!(loss, params(model), data, opt) PDE training examples are provided in `example` folder. -### One-dimensional +### One-dimensional Fourier neural operator [Burgers' equation](example/Burgers) ### Two-dimensional with time Navier-Stokes equation -The Navier-Stokes equation is learned by the `MarkovNeuralOperator` with only one time step information. -Example can be found in `example/FlowOverCircle`. -The result is also provided [here](https://foldfelis.github.io/NeuralOperators.jl/dev/assets/notebook/mno.jl.html) +### Markov Neural Operator -| **Ground Truth** | **Inferenced** | -|:----------------:|:--------------:| -| ![](example/FlowOverCircle/gallery/ans.gif) | ![](example/FlowOverCircle/gallery/inferenced.gif) | - -Use following commend to train model: - -```julia -$ julia --proj - -julia> using FlowOverCircle; FlowOverCircle.train() -``` +[Time dependent Navier-Stokes equation](example/FlowOverCircle) ## Roadmap diff --git a/example/FlowOverCircle/README.md b/example/FlowOverCircle/README.md new file mode 100644 index 00000000..dcbb520b --- /dev/null +++ b/example/FlowOverCircle/README.md @@ -0,0 +1,16 @@ +# Flow over the circle + +The time dependent Navier-Stokes equation is learned by the `MarkovNeuralOperator` with only one time step information. +The result of this example can be found [here](https://foldfelis.github.io/NeuralOperators.jl/dev/assets/notebook/mno.jl.html). + +| **Ground Truth** | **Inferenced** | +|:----------------:|:--------------:| +| ![](gallery/ans.gif) | ![](gallery/inferenced.gif) | + +Change directory to `example/FlowOverCircle` and use following commend to train model: + +```julia +$ julia --proj + +julia> using FlowOverCircle; FlowOverCircle.train() +``` From 525bd68345abf8a0a85698961aee726a652de652 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Sun, 12 Sep 2021 17:33:37 +0800 Subject: [PATCH 28/29] readme for DoublePendulum --- README.md | 6 ++++-- example/DoublePendulum/README.md | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 example/DoublePendulum/README.md diff --git a/README.md b/README.md index 10f0fd8a..79653fbc 100644 --- a/README.md +++ b/README.md @@ -70,11 +70,13 @@ Flux.@epochs 50 Flux.train!(loss, params(model), data, opt) PDE training examples are provided in `example` folder. -### One-dimensional Fourier neural operator +### One-dimensional Fourier Neural Operator [Burgers' equation](example/Burgers) -### Two-dimensional with time Navier-Stokes equation +### Two-dimensional Fourier Neural Operator + +[Double Pendulum](example/DoublePendulum) ### Markov Neural Operator diff --git a/example/DoublePendulum/README.md b/example/DoublePendulum/README.md new file mode 100644 index 00000000..f7019f61 --- /dev/null +++ b/example/DoublePendulum/README.md @@ -0,0 +1,20 @@ +# Double pendulum + +A [double pendulum](https://www.wikiwand.com/en/Double_pendulum) is a pendulum with another pendulum attached to its end. +In is example, instead of learning from a well-described equation of motion, +we train the model with the famous dataset provided by IBM. +The equation of motion to the real experiments of double pendulum is learned by a two-dimensional Fourier neural operator. +It learns to inference the next 30 steps with the given first 30 steps. +The result of this example can be found [here](https://foldfelis.github.io/NeuralOperators.jl/dev/assets/notebook/double_pendulum.jl.html). + +![](gallery/result.gif) + +By inference the result recurrently, we can generate up to 150 steps with the first 30 initial steps. + +Change directory to `example/DoublePendulum` and use following commend to train model: + +```julia +$ julia --proj + +julia> using DoublePendulum; DoublePendulum.train() +``` From e040ade3d992e37628b2c917b5118e1e725c54c6 Mon Sep 17 00:00:00 2001 From: JingYu Ning Date: Sun, 12 Sep 2021 17:40:16 +0800 Subject: [PATCH 29/29] update readme --- README.md | 9 +++++++++ docs/src/index.md | 1 - 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 79653fbc..c67a8c6b 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,15 @@ [codecov badge]: https://codecov.io/gh/foldfelis/NeuralOperators.jl/branch/master/graph/badge.svg?token=JQH3MP1Y9R [codecov link]: https://codecov.io/gh/foldfelis/NeuralOperators.jl +| **Ground Truth** | **Inferenced** | +|:----------------:|:--------------:| +| ![](example/FlowOverCircle/gallery/ans.gif) | ![](example/FlowOverCircle/gallery/inferenced.gif) | + +The demonstration showing above is Navier-Stokes equation learned by the `MarkovNeuralOperator` with only one time step information. +Example can be found in [`example/FlowOverCircle`](example/FlowOverCircle). + +## Abstract + Neural operator is a novel deep learning architecture. It learns a operator, which is a mapping between infinite-dimensional function spaces. It can be used to resolve [partial differential equations (PDE)](https://en.wikipedia.org/wiki/Partial_differential_equation). diff --git a/docs/src/index.md b/docs/src/index.md index aaaca700..d8c9f8c9 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -12,7 +12,6 @@ Documentation for [NeuralOperators](https://github.com/foldfelis/NeuralOperators The demonstration showing above is Navier-Stokes equation learned by the `MarkovNeuralOperator` with only one time step information. Example can be found in [`example/FlowOverCircle`](https://github.com/foldfelis/NeuralOperators.jl/tree/master/example/FlowOverCircle). -The result is also provided [here](assets/notebook/mno.jl.html) ## Abstract