LoginSignup
27
29

More than 5 years have passed since last update.

TensorFlowチュートリアル - 偏微分方程式(翻訳)

Posted at

TensorFlowのチュートリアル(Partial Differential Equations)
https://www.tensorflow.org/versions/master/tutorials/pdes/index.html#partial-differential-equations
の翻訳です。
翻訳の誤りなどあればご指摘お待ちしております。


TensorFlowは機械学習のためだけのものではありません。ここでは、TensorFlowを使用して偏微分方程式の挙動をシミュレートする(やや単調な)例を示します。正方形の池の表面にいくつかの雨滴が落ちる様子をシミュレートします。

注:このチュートリアルは、本来 IPython notebook のために準備しました。

基本設定

いくつかの import が必要です。

#Import libraries for simulation
import tensorflow as tf
import numpy as np

#Imports for visualization
import PIL.Image
from cStringIO import StringIO
from IPython.display import clear_output, Image, display

池の表面の状態を画像として表示する関数です。

def DisplayArray(a, fmt='jpeg', rng=[0,1]):
  """Display an array as a picture."""
  a = (a - rng[0])/float(rng[1] - rng[0])*255
  a = np.uint8(np.clip(a, 0, 255))
  f = StringIO()
  PIL.Image.fromarray(a).save(f, fmt)
  display(Image(data=f.getvalue()))

いじくりまわす利便性のために対話型TensorFlowセッションを開始します。通常のセッションでも、 .py 実行ファイルで実行すれば、同様に動作します。

sess = tf.InteractiveSession()

計算上の便利関数

def make_kernel(a):
  """Transform a 2D array into a convolution kernel"""
  a = np.asarray(a)
  a = a.reshape(list(a.shape) + [1,1])
  return tf.constant(a, dtype=1)

def simple_conv(x, k):
  """A simplified 2D convolution operation"""
  x = tf.expand_dims(tf.expand_dims(x, 0), -1)
  y = tf.nn.depthwise_conv2d(x, k, [1, 1, 1, 1], padding='SAME')
  return y[0, :, :, 0]

def laplace(x):
  """Compute the 2D laplacian of an array"""
  laplace_k = make_kernel([[0.5, 1.0, 0.5],
                           [1.0, -6., 1.0],
                           [0.5, 1.0, 0.5]])
  return simple_conv(x, laplace_k)

偏微分方程式の定義

自然界の大部分の池の場合のように、我々の池は完全な500×500の正方形です。

N = 500

池を作成し、いくつかの雨滴でそれを打ちます。

# Initial Conditions -- some rain drops hit a pond

# Set everything to zero
u_init = np.zeros([N, N], dtype="float32")
ut_init = np.zeros([N, N], dtype="float32")

# Some rain drops hit a pond at random points
for n in range(40):
  a,b = np.random.randint(0, N, 2)
  u_init[a,b] = np.random.uniform()

DisplayArray(u_init, rng=[-0.1, 0.1])

図

微分方程式の詳細を指定しましょう。

# Parameters:
# eps -- time resolution
# damping -- wave damping
eps = tf.placeholder(tf.float32, shape=())
damping = tf.placeholder(tf.float32, shape=())

# Create variables for simulation state
U  = tf.Variable(u_init)
Ut = tf.Variable(ut_init)

# Discretized PDE update rules
U_ = U + eps * Ut
Ut_ = Ut + eps * (laplace(U) - damping * Ut)

# Operation to update the state
step = tf.group(
  U.assign(U_),
  Ut.assign(Ut_))

シミュレーションを実行

楽しめる場所です―単純な for ループで時間を前に進めます。

# Initialize state to initial conditions
tf.initialize_all_variables().run()

# Run 1000 steps of PDE
for i in range(1000):
  # Step simulation
  step.run({eps: 0.03, damping: 0.04})
  # Visualize every 50 steps
  if i % 50 == 0:
    clear_output()
    DisplayArray(U.eval(), rng=[-0.1, 0.1])

図

見て!波紋!

27
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
29