2017-12-31 134 views
0

Ich bin neu in Tensorflow und ich hoffe, Sie können mir helfen.Wie kann man mit dem trainierten Tensorflow-Netzwerk Rückschlüsse ziehen?

Ich habe ein Tensorflow-CNN-Netzwerk aufgebaut und es erfolgreich trainiert. Die Trainingsdatensätze sind Matlab-Arrays. Jetzt möchte ich das trainierte Netzwerk verwenden, um Rückschlüsse zu ziehen. Ich bin mir nicht sicher, wie ich den Python-Code für Inferenz schreiben soll.

  1. Während des Trainings habe ich den Modus gespeichert. Ich bin mir nicht sicher, wie ich das Modell in Inferenz laden soll.
  2. Meine Inferenzdaten sind auch ein Matlab-Array, genauso wie Trainingsdaten. Wie kann ich es benutzen? Während des Trainings habe ich miniPatch von Tensorlayer benutzt, sollte ich miniPatch in Inferenz zwei verwenden?

Unten ist mein Inferenz-Code: es viele Fehler gab:

print("\n\nPreparing testing data........................") 
test_data = sio.loadmat('MyTest.mat') 
Z0 = test_data['Real_testing1'] 
img_num_test = Z0.shape[0] 
X_test = np.empty([img_num_test, 128, 128, 1], dtype=float) 
X_test[:,:,:,0] = Z0 
Y_test = np.column_stack((np.ones([img_num_test, 1], dtype=int),np.zeros([img_num_test, 1], dtype=int))) 
print("\tTesting X shape: {0}".format(X_test.shape)) 
print("\tTesting Y shape: {0}".format(Y_test.shape)) 


print("\n\Restore the network ...") 
save_dir = "checkpoints/"; 
epoch = 1000 
model_name = save_dir + str(epoch) + '_model' 
if not os.path.exists(save_dir): 
    os.makedirs(save_dir) 
saver = tf.train.Saver().restore(sess, save_path=model_name) 

start_time_begin = time.time() 

print("\n\Running network...") 

start_time = time.time() 

y = model.Scribenet(X_test[0, :, :, :], False, 1.0) 
y = sess.run([y], feed_dict=feed_dict) 
print(y[0:9]) 

sess.close() 

Unten ist mein Trainingscode:

x = tf.placeholder(tf.float32, shape=[None, 128, 128, 1], name='x') 
y_ = tf.placeholder(tf.int64, shape=[None, 2], name='y_') 
keep_prob = tf.placeholder(tf.float32, name='keep_prob') 
is_training = tf.placeholder(tf.bool, name='is_traininng') 

net_in = x 
net_out = model.MyCNN(net_in, is_training, keep_prob) 

y = net_out 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_, name='cost')) 
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
y_op = tf.argmax(tf.nn.softmax(y),1) 

train_op = tf.train.AdamOptimizer(learning_rate, beta1=0.9, beta2=0.999, 
             epsilon=1e-08, use_locking=False).minimize(cost) 

sess.run(tf.global_variables_initializer()) 

save_dir = "checkpoints/"; 
if not os.path.exists(save_dir): 
    os.makedirs(save_dir) 
saver = tf.train.Saver() 

print("\n\nStart training the network ...") 
start_time_begin = time.time() 
for epoch in range(n_epoch): 
    start_time = time.time() 
    loss_ep = 0; n_step = 0 
    for X_train_a, y_train_a in tl.iterate.minibatches(X_train, Y_train, 
               batch_size, shuffle=True): 
     feed_dict = {x: X_train_a, y_: y_train_a, is_training: True, keep_prob: train_keep_prob} 
     loss, _ = sess.run([cost, train_op], feed_dict=feed_dict) 
     loss_ep += loss 
     n_step += 1 
    loss_ep = loss_ep/ n_step 

    if (epoch+1) % save_freq == 0: 
     model_name = save_dir + str(epoch+1) + '_model' 
     saver.save(sess, save_path=model_name) 

Antwort

1

Das Hauptproblem scheint kein Graph Gebäude ist zu sein, dass es in Ihrem Inferenzcode. Sie müssen entweder das gesamte Diagramm speichern (in SavedModel format) oder ein Diagramm in Ihrem Inferenzcode erstellen und Ihre Variablen über einen Trainingskontrollpunkt laden (wahrscheinlich am einfachsten zu starten). Solange die Variablennamen identisch sind, können Sie aus dem Trainingsdiagramm gespeicherte Variablen in das Inferenzdiagramm laden.

Also Schlussfolgerung wird Ihr Trainingscode aber ohne y_ Platzhalter und ohne die Verlust/Optimierer-Logik. Sie können ein einzelnes Bild (Losgröße 1) zum Starten einspeisen, sodass Sie auch keine Chargenlogik benötigen.

Verwandte Themen