ホーム » TensorFlow » TensorFlow : Tutorials : Non-ML : 偏微分方程式

TensorFlow : Tutorials : Non-ML : 偏微分方程式

TensorFlow : Tutorials : Non-ML : 偏微分方程式 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
更新日時 : 07/15/2018; 09/15/2017
作成日時 : 02/25/2016

* TensorFlow 1.9 でドキュメント構成が変わりましたので調整しました。
* 本ページは、TensorFlow 本家サイトの Tutorials – Non-ML – Partial Differential Equations を翻訳した上で
適宜、補足説明したものです:

* (obsolete) 本ページは、TensorFlow の本家サイトの Tutorials – Partial Differential Equations を翻訳した上で
適宜、補足説明したものです:
    https://www.tensorflow.org/versions/master/tutorials/pdes/index.html#partial-differential-equations
* サンプルコードの動作確認はしておりますが、適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 
本文

TensorFlow は機械学習のためだけのものではありません。ここに偏微分方程式の振る舞いをシミュレートするための TensorFlow を使用した(いくぶん平凡な)例を示します。2、3の雨粒が着水した時の四角い池の表面をシミュレートします。

注意: このチュートリアルは元々 IPython notebook として準備されました。

 

基本的なセットアップ

2、3の import が必要です。

# シミュレーションのためのライブラリの import
import tensorflow as tf
import numpy as np

# 視覚化のための import
import PIL.Image
from cStringIO import StringIO
from IPython.display import clear_output, Image, display

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

def DisplayArray(a, fmt='jpeg', rng=[0,1]):
  """配列を絵 (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()
 

計算上の便利 (Computational Convenience) 関数

def make_kernel(a):
  """2D 配列を畳み込みカーネルに変換する"""
  a = np.asarray(a)
  a = a.reshape(list(a.shape) + [1,1])
  return tf.constant(a, dtype=1)

def simple_conv(x, k):
  """単純化された 2D 畳み込み演算"""
  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):
  """配列の 2D ラプラシアンを計算する"""
  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)
 

PDE を定義する

私たちの池は、自然で見られる多くの池のように完全な 500 x 500 の正方形です。

N = 500

ここで池を作成して幾つかの雨粒で叩きます。

# 初期条件 - 幾つかの雨粒が池を叩く

# 全てをゼロに設定する
u_init = np.zeros([N, N], dtype=np.float32)
ut_init = np.zeros([N, N], dtype=np.float32)

# 幾つかの雨粒がランダムなポイントで池を叩く
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])

jpeg

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

# パラメータ:
# eps -- 時間分解能(time resolution、時間解像度)
# damping -- 波減衰
eps = tf.placeholder(tf.float32, shape=())
damping = tf.placeholder(tf.float32, shape=())

# シミュレーション状態のための変数を作成する
U  = tf.Variable(u_init)
Ut = tf.Variable(ut_init)

# 離散化した (Discretized) PDE 更新ルール
U_ = U + eps * Ut
Ut_ = Ut + eps * (laplace(U) - damping * Ut)

# 状態を更新するための演算
step = tf.group(
  U.assign(U_),
  Ut.assign(Ut_))

シミュレーションを実行する

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

# 初期条件に状態を初期化する
tf.initialize_all_variables().run()

# PDE の 1000 ステップを実行する
for i in range(1000):
  # ステップ・シミュレーション
  step.run({eps: 0.03, damping: 0.04})
  # 50 ステップ毎に視覚化します
  if i % 50 == 0:
    clear_output()
    DisplayArray(U.eval(), rng=[-0.1, 0.1])

jpeg

見てください!さざ波です!

 

以上

AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com