2016-08-09 19 views
0

Ich baue ein Faltung neuronales Netzwerk mit Tensorflow.Tensorflow Wiederherstellung benannte Variablen

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial,name = 'weights') 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial, name = 'biases') 

def conv2d(x, W): 
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

def max_pool_2x2(x): 
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], 
         strides=[1, 2, 2, 1], padding='SAME') 

with tf.Graph().as_default(): 
    with tf.name_scope('convolution1'): 
     W_conv1 = weight_variable([5, 5, 1, 32]) 
     b_conv1 = bias_variable([32]) 

    x = tf.placeholder(tf.float32, shape=[None, 96*96]) 
    y_ = tf.placeholder(tf.float32, shape=[None, 30]) 
    x_image = tf.reshape(x, [-1,96,96,1]) 

    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 
    h_pool1 = max_pool_2x2(h_conv1) 

    with tf.name_scope('convolution2'): 
     W_conv2 = weight_variable([5, 5, 32, 64]) 
     b_conv2 = bias_variable([64]) 

    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
    h_pool2 = max_pool_2x2(h_conv2) 

    with tf.name_scope('connected'): 
     W_fc1 = weight_variable([24 * 24 * 64, 1024]) 
     b_fc1 = bias_variable([1024]) 

    h_pool2_flat = tf.reshape(h_pool2, [-1, 24*24*64]) 
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 

    keep_prob = tf.placeholder(tf.float32) 
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) 

    with tf.name_scope('output'): 
     W_fc2 = weight_variable([1024, 30]) 
     b_fc2 = bias_variable([30]) 

Danach mache ich einige Berechnungen und Schulungen und speichern Sie alle Variablen. Jetzt

i neu die gleiche Graphenstruktur in einem anderen Programm

PROGRAMM 2 Schnipsel

tf.reset_default_graph() 

x = tf.placeholder(tf.float32, shape=[None, 96*96]) 
x_image = tf.reshape(x, [-1,96,96,1]) 
y_ = tf.placeholder(tf.float32, shape=[None, 30]) 

with tf.name_scope('convolution1'): 
    W_conv1 = tf.Variable(-1.0, validate_shape = False, name = 'weights') 
    b_conv1 = tf.Variable(-1.0, validate_shape = False, name = 'biases') 

with tf.name_scope('convolution2'): 
    W_conv2 = tf.Variable(-1.0, validate_shape = False, name = 'weights') 
    b_conv2 = tf.Variable(-1.0, validate_shape = False, name = 'biases') 

with tf.name_scope('connected'): 
    W_fc1 = tf.Variable(-1.0, validate_shape = False, name = 'weights') 
    b_fc1 = tf.Variable(-1.0, validate_shape = False, name = 'biases') 

with tf.name_scope('output'): 
    W_fc2 = tf.Variable(-1.0, validate_shape = False, name = 'weights') 
    b_fc2 = tf.Variable(-1.0, validate_shape = False, name = 'biases') 

session = tf.Session() 
saver = tf.train.Saver() 
saver.restore(session, 'my-model-2000') 
vars_list = tf.get_collection(tf.GraphKeys.VARIABLES) 

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 
h_pool1 = max_pool_2x2(h_conv1) 
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
h_pool2 = max_pool_2x2(h_conv2) 
h_pool2_flat = tf.reshape(h_pool2, [-1, 24*24*64]) 
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 
y_convtry = tf.matmul(h_fc1, W_fc2) + b_fc2 
y_conv_alternate = 95.99*tf.ones_like(y_convtry) 
y_conv = tf.select(tf.greater(y_convtry, y_conv_alternate), y_conv_alternate, y_convtry) 

cost = tf.reduce_mean(tf.sqrt(tf.reduce_sum(tf.square(tf.select(tf.is_nan(y_), y_conv, y_) - y_conv), reduction_indices=[1]))) 

train_step = tf.train.AdamOptimizer(1e-4).minimize(cost,var_list = vars_list) 

Das Problem der Variablen in vars_list ist, wenn ich versuche, um ihre Form zu erhalten, die sie noch keine zeigen, aber läuft:

vars_list[i].eval(session = session) 

gibt die richtige Antwort, damit die Wiederherstellung w ist orking.

Meine Frage ist, warum nicht vars_list [i] .get_shape() die falsche Antwort geben tf.shape (vars_list [i]) scheint auch nicht zu funktionieren.

Dies ist ein Problem, weil wenn ich

tf.AdamOptimizer.minimize(cost) //This internally call var.get_shape() and throws error 

Antwort

1

verwenden Wenn Sie validate_shape=False setzt ein tf.Variable zum Erstellen, sagt diese TensorFlow, dass die Variable jede Form von Daten enthalten können, und ermöglicht es Ihnen, (zum Beispiel) wiederherstellen willkürlich geformte Prüfpunktdaten in die Variablen. Dies liefert TensorFlow jedoch keine statische Information über die Formen der Variablen, die (zum Beispiel) AdamOptimizer.minimize() verwendet, um passend geformte Akkumulatorschlitze zu bauen.

Die beste Lösung wäre, den gleichen Code zur Wiederverwendung für Variablen erstellen, die Sie in dem ersten Programm verwendet, das heißt

with tf.name_scope('convolution1'): 
    W_conv1 = weight_variable([5, 5, 1, 32]) 
    b_conv1 = bias_variable([32]) 

... und so weiter. Die Initialisierungsfunktionen für diese Variablen werden niemals ausgeführt, so dass es keine zusätzlichen Kosten für das Schreiben auf diese Weise gibt.

+0

Ja, das funktioniert, aber das ist wirklich eine mühsame Möglichkeit, Modelle wiederherzustellen, ich hoffe, sie kommen mit einem besseren Weg. –

+0

Der 'MetaGraphDef' ist als Serialisierungsformat für ganze Modelle konzipiert, beinhaltet die Modellstruktur und Checkpoints und ist weniger mühsam, was Sie tun möchten. Werfen Sie einen Blick auf das [Tutorial] (https://www.tensorflow.org/versions/r0.10/how_tos/meta_graph/index.html) für weitere Details. – mrry

Verwandte Themen