2016-10-22 3 views
1

Ich würde gerne wissen, wie man Tensorflow nur die spezifischen Matrixelemente aktualisieren lässt? Der folgende Code stammt von Tensorflow-Lernprogrammen (https://www.tensorflow.org/versions/r0.11/tutorials/pdes/index.html#partial-differential-equations).Tensorflow PDE Tutorial Fragen

#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]) 

In step = tf.group(U.assign(U_),Ut.assign(Ut_)), würde ich gerne wissen, ob es möglich ist, nur die Werte innerhalb U_ zu aktualisieren [1: 1, 1: 1] und Ut_ [1: 1, 1: 1] und die Restwerte als Konstanten beibehalten.

Vielen Dank!

+0

Dieser Fehler auf Ihre Frage nicht verwandt zu sein scheint. Sie müssen Tensorflow-Variablen initialisieren, bevor Sie sie zum ersten Mal verwenden. Versuchen Sie, Code vor dem ersten Aufruf von 'session.run()' in den Zeilen 'session.run (tf.initialize_all_variables())' einzufügen, vorausgesetzt, Sie haben eine Tensorflow-Sitzung mit dem Namen 'session'. –

+0

@Peter Hawkins Danke für den Kommentar. Um genauer zu sein, habe ich meine Fragen aktualisiert. Ich möchte eigentlich den Wert innerhalb von 'U_ [1: -1, 1: -1]' aktualisieren und die Restmatrixwerte konstant halten. – world2005

Antwort

2

Sie können die Slice-Zuweisung in Tensorflow durchführen. Probieren Sie etwas wie folgt aus:

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

(Die genauen Indizes sind bis zu Ihnen.)

+0

Ich habe versucht: 'step = tf.group (U [1: -1,1: -1] .zuweisen (U_ [1: -1,1: -1]), Ut [1: -1,1: - 1] .assign (Ut_ [1: -1,1: -1])) ', aber es funktioniert nicht. Es gibt einige Fehler wie 'verursacht durch op u'Variable_1/read' zurück, definiert unter: Datei "01_TF_Tutorial_PDE_test01.py", Zeile 64, in Ut = tf.Variable (ut_init) '. – world2005

+0

Können Sie die vollständige Fehlermeldung anzeigen? Welche Version von Tensorflow verwenden Sie? –

+0

Hier ist der Link für die vollständige Ausgabe Fehlermeldung [Link] (https://www.dropbox.com/s/fv97r5t045fcefb/Error_TF.txt?dl=0). Vielen Dank. – world2005

Verwandte Themen