La restauración del modelo lleva demasiado tiempo.

Tengo un problema restringido a mi modelo. Entrené a modelo y guardé un modelo usando este código. No estoy realmente seguro de si este es el método adecuado y agradecería las sugerencias. El problema se produce cuando estoy tratando de restaurar el modelo. Lo necesito solo para predecir, no será más entrenado. Se tarda una eternidad en restaurar los parámetros del modelo. ¿Cómo puedo mejorar mi protector de modelo o restaurador de modelos para hacerlo rápido, bajo el supuesto de que lo necesito solo para predecir?

X = tf.placeholder(tf.float32, [None, 56, 56, 1]) Y_ = tf.placeholder(tf.float32, [None, 36]) L1 = 432 L2 = 72 L3 = 36 W1 = tf.Variable(tf.truncated_normal([3136, L1], stddev=0.1)) b1 = tf.Variable(tf.zeros([L1])) W2 = tf.Variable(tf.truncated_normal([L1, L2], stddev=0.1)) b2 = tf.Variable(tf.zeros([L2])) W3 = tf.Variable(tf.truncated_normal([L2, L3], stddev=0.1)) b3 = tf.Variable(tf.zeros([L3])) XX = tf.reshape(X, [-1, 3136]) Y1 = tf.nn.sigmoid(tf.matmul(XX, W1) + b1) Y1 = tf.nn.dropout(Y1, keep_prob=0.8) Y2 = tf.nn.sigmoid(tf.matmul(Y1, W2) + b2) Y2 = tf.nn.dropout(Y2, keep_prob=0.8) Ylogits = tf.matmul(Y2, W3) + b3 Y = tf.nn.softmax(Ylogits) cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(logits=Ylogits, labels=Y_) cross_entropy = tf.reduce_mean(cross_entropy) * 100 correct_prediction = tf.equal(tf.argmax(Y, 1), tf.argmax(Y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) train_step = tf.train.GradientDescentOptimizer(0.0001).minimize(cross_entropy) allweights = tf.concat([tf.reshape(W1, [-1]), tf.reshape(W2, [-1]), tf.reshape(W3, [-1])], 0) allbiases = tf.concat([tf.reshape(b1, [-1]), tf.reshape(b2, [-1]), tf.reshape(b3, [-1])], 0) init = tf.global_variables_initializer() saver = tf.train.Saver() def next_batch(x, y, batch, step): x_temp = x[cur_step:(step+batch)] y_temp = np.squeeze(y[step:(step + batch)]) return x_temp, y_temp with tf.Session() as sess: sess.run(init) cur_step = 0 for i in range(NUM_ITERS + 1): batch_X, batch_Y = next_batch(train_xx, train_yy, BATCH, cur_step) if i % DISPLAY_STEP == 0: acc_trn, loss_trn, w, b = sess.run([accuracy, cross_entropy, allweights, allbiases], feed_dict={X: batch_X, Y_: batch_Y}) acc_tst, loss_tst = sess.run([accuracy, cross_entropy], feed_dict={X: test_xx, Y_: test_yy}) sess.run(train_step, feed_dict={X: batch_X, Y_: batch_Y}) save_path = saver.save(sess, "abc/model") 

Restaurar:

 X = tf.placeholder(tf.float32, [None, 56, 56, 1]) Y_ = tf.placeholder(tf.float32, [None, 36]) L1 = 432 L2 = 72 L3 = 36 W1 = tf.Variable(tf.truncated_normal([3136, L1], stddev=0.1)) b1 = tf.Variable(tf.zeros([L1])) W2 = tf.Variable(tf.truncated_normal([L1, L2], stddev=0.1)) b2 = tf.Variable(tf.zeros([L2])) W3 = tf.Variable(tf.truncated_normal([L2, L3], stddev=0.1)) b3 = tf.Variable(tf.zeros([L3])) XX = tf.reshape(X, [-1, 3136]) Y1 = tf.nn.sigmoid(tf.matmul(XX, W1) + b1) Y1 = tf.nn.dropout(Y1, keep_prob=0.8) Y2 = tf.nn.sigmoid(tf.matmul(Y1, W2) + b2) Y2 = tf.nn.dropout(Y2, keep_prob=0.8) Ylogits = tf.matmul(Y2, W3) + b3 Y = tf.nn.softmax(Ylogits) with tf.Session() as sess: saver = tf.train.Saver() saver = tf.train.import_meta_graph('model.meta') saver.restre(sess, 'model') 

EDITAR: Tal vez sea importante el hecho de que el modelo esté entrenado con la GPU de Google Colab y lo esté restaurando en mi PC.

Es un duplicado de: Tensorflow: ¿cómo guardar / restaurar un modelo? .

Su guardado del modelo es correcto pero no su restauración. Lo que está haciendo es intentar crear un nuevo gráfico con los mismos nodos que el modelo guardado, en lugar de restaurarlo desde el gráfico guardado. Los siguientes pasos deben abordar su problema sobre cómo restaurar un modelo:

 #Start with resetting the default graph tf.reset_default_graph() with tf.Session() as sess: # Nodes:Before loading the graph print([n.name for n in tf.get_default_graph().as_graph_def().node]) # Output is [] as no graph is loaded yet. # First let's load meta graph saver = tf.train.import_meta_graph("abc/model.meta") # Nodes:after loading the graph' print([n.name for n in tf.get_default_graph().as_graph_def().node]) # Output is [save/RestoreV2/shape_and_slices', 'save/RestoreV2/tensor_ ...] # The above step doesnt load the weights, can be checked by print(sess.run('Variable_1:0')) # Error: attempting to use uninitialized graph. #load the weights saver.restre(sess,tf.train.latest_checkpoint('./abc/')) print(sess.run('Variable_1:0')) # Output: [-2.80421402e-04 3.53254407e-04 ...] 

Ahora que tenemos los nodos cargados y listos, necesita acceder a algunos de ellos para inferencia. Pero como los nodos no se nombran correctamente, no es fácil averiguar qué nodo son entradas y salidas. Para evitar esto, debe asignar un name los tensores / ops al guardar el modelo correctamente utilizando el argumento de name como:

 X = tf.placeholder(tf.float32, [None, 56, 56, 1], name='X') Y = tf.identity(f.nn.softmax(Ylogits), name='logits'). 

En su gráfico de inferencia, una vez que haya cargado el gráfico y los pesos, puede obtener estos tensores utilizando get_tensor_by_name :

 with tf.Session() as sess: #Load the graph and weights as above .... graph = tf.get_default_graph() X_infer = graph.get_tensor_by_name('X:0') Y_infer = graph.get_tensor_by_name('logits:0') sess.run(Y_infer,{X_infer:new_input}