Giter Club home page Giter Club logo

pydens's Introduction

License Python PyTorch

PyDEns

PyDEns is a framework for solving Ordinary and Partial Differential Equations (ODEs & PDEs) using neural networks. With PyDEns one can solve

This page outlines main capabilities of PyDEns. To get an in-depth understanding we suggest you to also read the tutorial.

Getting started with PyDEns: solving common PDEs

Let's solve poisson equation

using simple feed-forward neural network. Let's start by importing Solver-class along with other needed libraries:

from pydens import Solver, NumpySampler
import numpy as np
import torch

You can now set up a PyDEns-model for solving the task at hand. For this you need to supply the equation into a Solver-instance. Note the use of differentiation token D:

# Define the equation as a callable.
def pde(f, x, y):
    return D(D(f, x), x) + D(D(f, y), y) - 5 * torch.sin(np.pi * (x + y))

# Supply the equation, initial condition, the number of variables (`ndims`)
# and the configration of neural network in Solver-instance.
solver = Solver(equation=pde, ndims=2, boundary_condition=1,
                layout='fa fa fa f', activation='Tanh', units=[10, 12, 15, 1])

Note that we defined the architecture of the neural network by supplying layout, activation and units parameters. Here layout configures the sequence of layers: fa fa fa f stands for fully connected architecture with four layers and three activations. In its turn, units and activation cotrol the number of units in dense layers and activation-function. When defining neural network this way use ConvBlock from BatchFlow.

It's time to run the optimization procedure

solver.fit(batch_size=100, niters=1500)

in a fraction of second we've got a mesh-free approximation of the solution on [0, 1]X[0, 1]-square:

Going deeper into PyDEns-capabilities

PyDEns allows to do much more than just solve common PDEs: it also deals with (i) parametric families of PDEs and (ii) PDEs with trainable coefficients.

Solving parametric families of PDEs

Consider a family of ordinary differential equations

Clearly, the solution is a sin wave with a phase parametrized by ϵ:

Solving this problem is just as easy as solving common PDEs. You only need to introduce parameter e in the equation and supply the number of parameters (nparams) into a Solver-instance:

def odeparam(f, x, e):
    return D(f, x) - e * np.pi * torch.cos(e * np.pi * x)

# One for argument, one for parameter
s = NumpySampler('uniform') & NumpySampler('uniform', low=1, high=5)

solver = Solver(equation=odeparam, ndims=1, nparams=1, initial_condition=1)
solver.fit(batch_size=1000, sampler=s, niters=5000, lr=0.01)
# solving the whole family takes no more than a couple of seconds!

Check out the result:

Solving PDEs with trainable coefficients

With PyDEns things can get even more interesting! Assume that the initial state of the system is unknown and yet to be determined:

Of course, without additional information, the problem is undefined. To make things better, let's fix the state of the system at some other point:

Setting this problem requires a slightly more complex configuring. Note the use of V-token, that stands for trainable variable, in the initial condition of the problem. Also pay attention to the additional constraint supplied into the Solver instance. This constraint binds the final solution to zero at t=0.5:

def odevar(u, t):
    return D(u, t) - 2 * np.pi * torch.cos(2 * np.pi * t)
def initial(*args):
    return V('init', data=torch.Tensor([3.0]))

solver = Solver(odevar, ndims=1, initial_condition=initial,
                constraints=lambda u, t: u(torch.tensor([0.5])))

When tackling this problem, pydens will not only solve the equation, but also adjust the variable (initial condition) to satisfy the additional constraint. Hence, model-fitting comes in two parts now: (i) solving the equation and (ii) adjusting initial condition to satisfy the additional constraint. Inbetween the steps we need to freeze layers of the network to adjust only the adjustable variable:

solver.fit(batch_size=150, niters=100, lr=0.05)
solver.model.freeze_layers(['fc1', 'fc2', 'fc3'], ['log_scale'])
solver.fit(batch_size=150, niters=100, lr=0.05)

Check out the results:

Installation

First of all, you have to manually install pytorch, as you might need a certain version or a specific build for CPU / GPU.

Stable python package

With modern pipenv

pipenv install pydens

With old-fashioned pip

pip3 install pydens

Development version

pipenv install git+https://github.com/analysiscenter/pydens.git
pip3 install git+https://github.com/analysiscenter/pydens.git

Installation as a project repository:

Do not forget to use the flag --recursive to make sure that BatchFlow submodule is also cloned.

git clone --recursive https://github.com/analysiscenter/pydens.git

In this case you need to manually install the dependencies.

Citing PyDEns

Please cite PyDEns if it helps your research.

Roman Khudorozhkov, Sergey Tsimfer, Alexander Koryagin. PyDEns framework for solving differential equations with deep learning. 2019.
@misc{pydens_2019,
  author       = {Khudorozhkov R. and Tsimfer S. and Koryagin. A.},
  title        = {PyDEns framework for solving differential equations with deep learning},
  year         = 2019
}

pydens's People

Contributors

a-arefina avatar akoryagin avatar roman-kh avatar sergeytsimfer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pydens's Issues

Plotting problem

pyDens not plotting after running solver.fit() on both Jupyter notebook and google colaboratory.
Using the first example from Github solver.fit() seems to run fine but I was expecting a plot of the results to appear. What am i missing?

Pyden Installation Problem

Dear all,
I have a problem installing the packages.
In Jypyter notebook , Python 3; I use pip install pydens and it has installed successfully.
Next when writing
from pydens import Solver, NumpySampler, add_tokens
getting error
"module 'tensorflow' has no attribute 'layers'"
Plz fix it.

How to install easily with PIP command?

Dear Guys
I am extremely interested in working with your product but I have a problem installing the packages. I installed using different ways but I faced "No module named 'pydens.batchflow'" and I do not have any idea to solve it. I will appreciate it if could do a favor of installing.

Thanks in advanced

There are some references so I can learn the body "layout characters/symbols"?

For example:
"""
body = {'layout': 'fa f',
'units': [10, 1],
'activation': [tf.nn.tanh,]}
"""
This means that there are one first full connected layer with 10 units and activation "tanh" ('fa') and a final full connected layer with no activation ('f').

But what about:
"""
body = {'layout': 'faR fa fa+ f',
'units': [10, 25, 10, 1],
'activation': [tf.nn.tanh, tf.nn.tanh, tf.nn.tanh]}
"""
What does 'R' mean? And the character '+'?

Thank you.

"No module named 'pydens.batchflow' "

I'm using Spyder3 to run this code:

`
import pydens as pde
from pydens import D
import numpy as np
import tensorflow as tf

pde.add_tokens()

pde = {'n_dims': 2,
'form': lambda u, x, y: D(D(u, x), x) + D(D(u, y), y) - 5 * pde.sin(np.pi * (x + y)),
'boundary_condition': 1}

body = {'layout': 'fa fa fa f', #estrutura da rede neural (layers)
'units': [15, 25, 15, 1], #neurônios por camada
'activation': [tf.nn.tanh, tf.nn.tanh, tf.nn.tanh]} #ativação advinda do TFlow

config = {'body': body,
'pde': pde}

us = pde.NumpySampler('uniform', dim=2)

dg = pde.Solver(config)
dg.fit(batch_size=100, sampler=us, n_iters=1500)
`
...and I'm getting this error:

`File "C:\Users\my_user\Anaconda3\lib\site-packages\pydens\letters.py", line 20, in
from .batchflow.models.tf.layers import conv_block

ModuleNotFoundError: No module named 'pydens.batchflow'`

My tersorflow are actualized and I got PyDEns and Batchflow with pip on conda terminal.

How to solve Elliptic PDE with four different boundary conditions?

Hi,
@roman-kh @akoryagin @SergeyTsimfer @dpodvyaznikov

Firstly I want to thanks to you guys for making great library for solving PDE with NN. Now I'm going on project for solving PDE with NN too and interested to used your library and on practicing using it. But, I have an issue when try to solve Poisson eq with 4 different bc. For the example I practiced to solve this eq:

                              Uxx+Uyy = 4, 

with BC:

u(x, 0) = x^2,        u(x, 2) = (x-2)^2,          0<= x <=1
u(0, y) = y^2,        u(1, y) = (y-1)^2,          0<= y <=2

I can't find the correct solution to solving this PDE. I realized that there was a mistake when writing the code.
But I can't find any correction in your documentation. Could you please help me how to write the correct code for this kind of PDE? Thank you very much.

pde = {
    'n_dims': 2, 
    'form': lambda u, x, y: D(D(u, x), x) + D(D(u, y), y) - 4,
    'boundary_condition': .........    <------- (how to write those BC mentioned above to here?)
}

How to set an additional initial condition?


image

If I have this two initial condition ,and I set the first initial condition like
'solver = Solver(pde, ndims=5, nparams=1,
initial_condition=0,boundary_condition=0,
layout='fafafafaf', units=[10, 30, 50, 30, 1], activation='TanH')'
but how can I add another one in my program?

compilation error in Google Collab

I am getting compilation error in the coding line given below...Kindly tell me ....how to fix it....
I am using google collab for compilation

dg = Solver(config)
dg.fit(batch_size=50, sampler=s, n_iters=300, bar='notebook')

OperatorNotAllowedInGraphError Traceback (most recent call last)
in ()
----> 1 dg = Solver(config)
2 dg.fit(batch_size=50, sampler=s, n_iters=300, bar='notebook')

15 frames
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/ops.py in _disallow_in_graph_mode(self, task)
521 raise errors.OperatorNotAllowedInGraphError(
522 "{} is not allowed in Graph execution. Use Eager execution or decorate"
--> 523 " this function with @tf.function.".format(task))
524
525 def _disallow_bool_casting(self):

OperatorNotAllowedInGraphError: iterating over tf.Tensor is not allowed in Graph execution. Use Eager execution or decorate this function with @tf.function.

How to solve if Parametric heat-equation in the example has 2 or 3 boundary conditions?

Hi,
Can Pydens handle the PDE with more than 2 boundary conditions?
In the parametric heat-equation example, would you please show me how to change the boundary condition to:
case 1:
u(x,y,t=0)=1000
u(x=0, y=0, t)=200
case 2:
u(x,y,t=0)=1000
u(x=0, y=0, t)=200
u(xe,0)=u(-xe,0)=u(0,ye)=u(ye,0)=1000 (e represents edge, which indicates all boundaries have same value)

How can I change the interval of x

Hello Everyone
I want to change the interval of x. Instead of using the default one [0,1], I want to have [1, 1.5] so I can define my boundary conditions in these two points?
How could I modify the code?

LBFGS optimizer not working

The code block below results in error:

solver = Solver(equation=pde, ndims=2,constraints=constraints,domain=domain,layout='fa fa f', units=(10,20,1), activation='Sigmoid')
solver.fit(batch_size=100, niters=5000, lr=0.01,optimizer='LBFGS')

Error:

  0%|                                                                                   | 0/5000 [00:00<?, ?it/s]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
File <timed exec>:8, in <module>

File D:\anaconda3\envs\pydens_gpu\lib\site-packages\pydens\model_torch.py:461, in Solver.fit(self, niters, batch_size, sampler, loss_terms, optimizer, criterion, lr, **kwargs)
    459 # Optimizer step.
    460 loss.backward()
--> 461 self.optimizer.step()
    463 # Gather and store training stats.
    464 self.losses.append(loss.detach().cpu().numpy())

File D:\anaconda3\envs\pydens_gpu\lib\site-packages\torch\optim\optimizer.py:88, in Optimizer._hook_for_profile.<locals>.profile_hook_step.<locals>.wrapper(*args, **kwargs)
     86 profile_name = "Optimizer.step#{}.step".format(obj.__class__.__name__)
     87 with torch.autograd.profiler.record_function(profile_name):
---> 88     return func(*args, **kwargs)

File D:\anaconda3\envs\pydens_gpu\lib\site-packages\torch\autograd\grad_mode.py:27, in _DecoratorContextManager.__call__.<locals>.decorate_context(*args, **kwargs)
     24 @functools.wraps(func)
     25 def decorate_context(*args, **kwargs):
     26     with self.clone():
---> 27         return func(*args, **kwargs)

TypeError: step() missing 1 required positional argument: 'closure'

Any idea on how to use LBFGS optimizer ?

Compilation error

Hello,
I want to code according to the pydens and during compilation I am using an error at "dg solver line".
Kindly fix it ASAP so that I can move further to code my problem.

I am using tensorflow 1.15 version
======================code================

%tensorflow_version 1.x
import os
import sys

Stop TF from showing unnecessary deprecation warnings

import warnings
warnings.filterwarnings('ignore')
from tensorflow import logging
logging.set_verbosity(logging.ERROR)
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

import numpy as np
import tensorflow as tf
from tqdm import tqdm_notebook
import matplotlib.pyplot as plt

sys.path.append('..') # this line is not needed if PyDEns is installed as package
from pydens import Solver, NumpySampler, cart_prod, add_tokens
from pydens import plot_loss, plot_pair_1d, plot_2d, plot_sections_2d, plot_sections_3d

add_tokens()

describing pde-problem in pde-dict

pde = {
'n_dims': 1,
'form': lambda u, t: D(u, t) - 2 * np.pi * cos(2 * np.pi * t),
'initial_condition': 1
}

put it together in model-config

config = {
'pde': pde,
'track': {'dt': lambda u, t: D(u, t)} # allows to later fetch this value from the model
}

uniform sampling scheme

s = NumpySampler('uniform')

train the network on batches of 100 points

dg = Solver(config)
dg.fit(batch_size=100, sampler=s, n_iters=2000, bar='notebook')

plot_loss(dg.loss, color='cornflowerblue')

plot real solution and network approximation

pts = np.linspace(0, 1, 200).reshape(-1, 1)
sol = lambda t: np.sin(2 * np.pi * t) + 1
true = [sol(t[0]) for t in pts]
approxs = dg.solve(pts)

plt.plot(pts, true, 'b--', linewidth=3, label='True solution')
plt.plot(pts, approxs, 'r', label='Network approximation')
plt.xlabel(r'$t$', fontdict={'fontsize': 14})
plt.legend()
plt.show()

plot approximation of solution-derivative

der = lambda t: 2 * np.pi * np.cos(2 * np.pi * t)
true_der = [der(t[0]) for t in pts]
ders = dg.solve(pts, fetches='dt')

plt.plot(pts, true_der, 'b--', linewidth=3, label=r'True derivative')
plt.plot(pts, ders, 'r', label=r'Network approximation of $\frac{d u}{d t}$')
plt.xlabel(r'$t$', fontdict={'fontsize': 14})
plt.legend()
plt.show()

plot_pair_1d(model=dg,
solution=lambda t: np.sin(2np.pit)+1,
confidence=0.15, alpha=0.2)

plot_pair_1d(model=dg,
solution=lambda t: 2 * np.pi * np.cos(2 * np.pi * t),
fetches='dt')


======================error is====================
OperatorNotAllowedInGraphError Traceback (most recent call last)
in ()
40
41 # train the network on batches of 100 points
---> 42 dg = Solver(config)
43 dg.fit(batch_size=100, sampler=s, n_iters=2000, bar='notebook')
44

15 frames
/tensorflow-1.15.2/python3.6/tensorflow_core/python/framework/ops.py in _disallow_in_graph_mode(self, task)
521 raise errors.OperatorNotAllowedInGraphError(
522 "{} is not allowed in Graph execution. Use Eager execution or decorate"
--> 523 " this function with @tf.function.".format(task))
524
525 def _disallow_bool_casting(self):

OperatorNotAllowedInGraphError: iterating over tf.Tensor is not allowed in Graph execution. Use Eager execution or decorate this function with @tf.function.

boundry conditions

image
Hi
how can i add this boundry condition with limited domain in this code
thanks for your attention

Can anyone tell me the version of all the python packages installed?

Dear sir:

I need to know what python libraries and corresponding versions need to be installed in this project to get the code running, I've tried a lot of things, but I can't fix the proper installation of the environment, which has been bothering me for a long time, and thank you very much for taking the time to answer my questions. Thank you very much!

Best
zmzhang

Bug: type of missing layer (`ConvBlock`)

I was trying to test the examples you put in the repository (torch_examples.ipynb), but several things did not work for me, so I get the impression that the project has done some refactoring and this notebook has not been updated.

The first thing is that the CustomModel type is not implemented in model_torch.py. Then the second problem I encountered is that the ConvBlockModel type imports ConvBlock type is not implemented in batchflow.models.torch.layers.

What causes me more doubt about these errors is that the ConvBlock type has not been implemented since a few releases ago, they deleted it and do not plan to use it anymore? In that case, they would have to resolve the layouts in the ConvBlockModel type definition.

Some miscellaneous questions.

When I dont define a "body", whats is the structure of the network?
Theres some easy way to save my trained network, so I can use it?

"SyntalxTreeNode" object not iterable error

While running the solved example:

import os
import warnings
import sys

warnings.filterwarnings('ignore')
from tensorflow import logging
logging.set_verbosity(logging.ERROR)
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

import numpy as np
import tensorflow as tf
from tqdm import tqdm_notebook
import matplotlib.pyplot as plt

sys.path.append('..')
from pydens import Solver, NumpySampler, cart_prod
from pydens import plot_loss, plot_2d, plot_pair_1d, plot_sections_2d, plot_sections_3d

from pydens import add_tokens
add_tokens()

# describing pde-problem in pde-dict
pde = {'n_dims': 1,
       'form': lambda u, t: D(u, t) - 2 * np.pi * cos(2 * np.pi * t),
       'initial_condition': 1 # will be transformed into callable returning 1
      }

# put it together in model-config
config = {'pde': pde,
          'track': {'dt': lambda u, t: D(u, t)}}

# uniform sampling scheme
s = NumpySampler('uniform')

#
## train the network on batches of 100 points
dg = Solver(config)

I run into the following error:
TypeError: 'SyntaxTreeNode' object is not iterable

The stacktrace is:

File "<ipython-input-21-1b5c74329633>", line 1, in <module>
    runfile('/home/nirvik/Documents/neuronal_model_python/temp.py', wdir='/home/nirvik/Documents/neuronal_model_python')

  File "/usr/lib/python3/dist-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "/usr/lib/python3/dist-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/home/nirvik/Documents/neuronal_model_python/temp.py", line 38, in <module>
    dg = Solver(config)

  File "/home/nirvik/.local/lib/python3.6/site-packages/pydens/wrapper.py", line 21, in __init__
    self.model = model_class(config)

  File "/home/nirvik/.local/lib/python3.6/site-packages/pydens/batchflow/batchflow/models/tf/base.py", line 262, in __init__
    super().__init__(*args, **kwargs)

  File "/home/nirvik/.local/lib/python3.6/site-packages/pydens/batchflow/batchflow/models/base.py", line 38, in __init__
    self.build(*args, **kwargs)

  File "/home/nirvik/.local/lib/python3.6/site-packages/pydens/batchflow/batchflow/models/tf/base.py", line 331, in build
    config = self.build_config()

  File "/home/nirvik/.local/lib/python3.6/site-packages/pydens/model_tf.py", line 117, in build_config
    n_parameters = get_num_parameters(form[0])

  File "/home/nirvik/.local/lib/python3.6/site-packages/pydens/syntax_tree.py", line 77, in get_num_parameters
    tree = form(*[SyntaxTreeNode('_' + str(i)) for i in range(n_args)])

  File "/home/nirvik/Documents/neuronal_model_python/temp.py", line 25, in <lambda>
    'form': lambda u, t: D(u, t) - 2 * np.pi * 2 * t^3,

  File "/home/nirvik/.local/lib/python3.6/site-packages/pydens/tokens.py", line 63, in <lambda>
    if isinstance(args[0], SyntaxTreeNode) else method_(*args, **kwargs))

  File "/home/nirvik/.local/lib/python3.6/site-packages/pydens/letters.py", line 82, in D
    return np.stack([self.D(func, coordinate) for coordinate in coordinates],
```

I am new to using this package...please help.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.