2016-10-22 70 views
1

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

#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] ,並保留其餘的值作爲常量。

非常感謝!

+0

這錯誤似乎無關。您需要在首次使用Tensorflow變量之前初始化Tensorflow變量。假設您有一個名爲'session'的Tensorflow會話,在第一次真正調用session.run()之前,嘗試在'session.run(tf.initialize_all_variables())'行添加一些代碼。 –

+0

@彼得霍金斯感謝您的評論。更具體地說,我更新了我的問題。我實際上想更新'U_ [1:-1,1:-1]內的值,並保持其餘矩陣值不變。 – world2005

回答

2

您可以在Tensorflow中執行切片分配。嘗試是這樣的:你的問題

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

(確切的指標是由您決定。)

+0

我試過了:'step = tf.group(U [1:-1,1:-1] .assign(U_ [1:-1,1:-1]),Ut [1:-1,1: 1] .assign(Ut_ [1:-1,1:-1]))',但它不起作用。它返回一些錯誤,如'由op u'Variable_1/read引起',定義如下: 文件「01_TF_Tutorial_PDE_test01.py」,第64行,在 Ut = tf.Variable(ut_init)'。 – world2005

+0

你能顯示完整的錯誤信息嗎?您使用的是什麼版本的Tensorflow? –

+0

以下是完整的輸出錯誤消息[鏈接]的鏈接(https://www.dropbox.com/s/fv97r5t045fcefb/Error_TF.txt?dl=0)。非常感謝你。 – world2005