2016-10-22 2 views
1

Я хотел бы знать, как позволить Tensorflow обновлять только определенные элементы матрицы? Следующий код из обучающих программ Tensorflow (https://www.tensorflow.org/versions/r0.11/tutorials/pdes/index.html#partial-differential-equations).Tensorflow PDE Tutorial Questions

#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, прежде чем использовать их в первый раз. Попробуйте добавить код по строкам 'session.run (tf.initialize_all_variables()) перед вашим первым реальным вызовом' session.run() ', предполагая, что у вас есть сеанс Tensorflow с именем' session'. –

+0

@Peter Hawkins Спасибо за комментарий. Чтобы быть более конкретным, я обновил свои вопросы. Я действительно хочу обновить значение внутри '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])) ', но он не работает. Он возвращает некоторые ошибки, такие как 'Caused by op u'Variable_1/read ', определенный по адресу: Файл« 01_TF_Tutorial_PDE_test01.py », строка 64, в Ut = tf.Variable (ut_init)'. – world2005

+0

Можете ли вы показать полное сообщение об ошибке? Какую версию Tensorflow вы используете? –

+0

Вот ссылка на полное сообщение об ошибке выхода [link] (https://www.dropbox.com/s/fv97r5t045fcefb/Error_TF.txt?dl=0). Большое спасибо. – world2005