Tensorflow PDE教程问题

时间:2016-10-22 02:25:38

标签: tensorflow

我想知道如何让Tensorflow只更新特定的矩阵元素?以下代码来自Tensorflow教程(https://www.tensorflow.org/versions/r0.11/tutorials/pdes/index.html#partial-differential-equations)。

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

  #Imports for visualization
  import PIL.Image

  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))
    with open("fig/image.jpg","w") as f:
        PIL.Image.fromarray(a).save(f, "jpeg")

  #sess = tf.Session()
  sess = tf.InteractiveSession()

  # Computational Convenience Functions

  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)

  # Define the PDE

  N = 500

  # Initial Conditions -- some rain drops hit a pond

  # Set everything to zero
  u_init = np.zeros([N, N], dtype=np.float32)
  ut_init = np.zeros([N, N], dtype=np.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_))

  # 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})
    DisplayArray(U.eval(), rng=[-0.1, 0.1])

step = tf.group(U.assign(U_),Ut.assign(Ut_))中,我想知道是否有可能只更新U_ [1:-1,1:-1]和Ut_ [1:-1,1:-1]中的值,并将其余值保持为常量。

非常感谢!

1 个答案:

答案 0 :(得分:2)

您可以在Tensorflow中执行切片分配。尝试这样的事情:

assign_op = U[1:-1,1:-1].assign(U_[1:-1, 1:-1])

(确切的指数取决于你。)