【问题标题】:Apply a trained Tensorflow应用经过训练的 TensorFlow
【发布时间】:2018-09-27 18:28:56
【问题描述】:

在训练过程中,我使用 train_test_split() 将数据集拆分为训练和测试数据:

from sklearn.model_selection import train_test_split
import tensorflow as tf
import numpy as np

X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.33, random_state=28)

with tf.Session(graph=graph) as sess:
    sess.run(tf.global_variables_initializer())
    print ('History length: ',history)
    saver = tf.train.Saver()
    writer = tf.summary.FileWriter("logs", sess.graph)

    plt.ion()
    plt.show()

    for epoch in range(num_epochs):
        shuffle_ind=np.random.permutation(X_train.shape[0])
        y_train=y_train.iloc[shuffle_ind,:]
        X_train=X_train[shuffle_ind,:]

        for batch_no in range(X_train.shape[0]//batch_size):
            seq_len=[history]*batch_size

            batch_X=X_train[batch_no*batch_size:(batch_no+1)*batch_size,:]
            batch_y=y_train.iloc[batch_no*batch_size:(batch_no+1)*batch_size,:]

            feed = {data_pl: batch_X, target_pl: batch_y.iloc[:,1:], seq_len_pl:seq_len,keep_prob_pl:0.5} #1.0
            _,batch_loss = sess.run([train_op,tf_loss], feed_dict=feed)

        feed = {data_pl: X_test, target_pl: y_test.iloc[:,1:], seq_len_pl:[history]*X_test.shape[0],keep_prob_pl:0.5}
        test_loss,predictions,acc_np = sess.run([tf_loss,preds,tf_acc], feed_dict=feed)

        p_=np.argmax(predictions, axis=1)
        l_=np.argmax(np.array(y_test.iloc[:,1:]),axis=1)
        acc = sum(p_==l_)/float(len(p_))

        print ("train_acc: ", acc, "test_acc: ", acc_np)

        feed = {data_pl: X_train, target_pl: y_train.iloc[:,1:], seq_len_pl:[history]*X_train.shape[0],keep_prob_pl:0.5}
        train_loss = sess.run(tf_loss, feed_dict=feed)

        print ("Train loss: ",train_loss," Test loss: ",test_loss)

在训练并获得准确率之后,如何将这个训练好的模型应用于整个数据集,而不仅仅是测试数据?

【问题讨论】:

    标签: python tensorflow neural-network


    【解决方案1】:

    假设‘OutPut’是神经网络的一个输出;因此,“InPut”是您可以输入数据的地方。然后,您使用与训练相同的会话运行网络。“OutPutData”将是计算结果。

    OutPutData = session.run(OutPut, feed_dict={ InPut: Data})
    

    【讨论】:

      【解决方案2】:

      在恢复保存的变量之前,Tensorflow 需要一个空的网络结构。如果你不喜欢这个,我推荐 Keras。在这个例子中,著名的 AlexNet 被还原来对一些图像进行分类。我希望它包含您需要的代码。

      import time
      import tensorflow as tf
      from alexnet import AlexNet
      from imageio import imread
      import numpy as np
      from caffe_classes import class_names
      
      #Tensor 
      x = tf.placeholder(tf.float32, (None, 227, 227, 3))
      probs = AlexNet(x, feature_extract=False)
      
      
      sess = tf.Session()
      sess.run(tf.global_variables_initializer())
      
      saver = tf.train.Saver()
      save_file = './model.ckpt'
      saver.restore(sess, save_file)
      
      # Read Images
      im1 = (imread(".\Example_Figs\weasel.png")[:, :, :3]).astype(np.float32)
      im1 = im1 - np.mean(im1)
      im1[:, :, 0], im1[:, :, 2] = im1[:, :, 2], im1[:, :, 0]
      
      im2 = (imread(".\Example_Figs\poodle.png")[:, :, :3]).astype(np.float32)
      im2 = im2 - np.mean(im2)
      im2[:, :, 0], im2[:, :, 2] = im2[:, :, 2], im2[:, :, 0]
      
      im3 = (imread(".\Example_Figs\dog.png")[:, :, :3]).astype(np.float32)
      im3 = im3 - np.mean(im3)
      im3[:, :, 0], im3[:, :, 2] = im3[:, :, 2], im3[:, :, 0]
      
      im4 = (imread(".\Example_Figs\dog2.png")[:, :, :3]).astype(np.float32)
      im4 = im4 - np.mean(im4)
      im4[:, :, 0], im4[:, :, 2] = im4[:, :, 2], im4[:, :, 0]
      
      im5 = (imread(".\Example_Figs\quail.jpg")[:, :, :3]).astype(np.float32)
      im5 = im5 - np.mean(im5)
      im5[:, :, 0], im5[:, :, 2] = im5[:, :, 2], im5[:, :, 0]
      
      
      t = time.time()
      output = sess.run(probs, feed_dict={x: [im1, im2, im3, im4, im5]})
      
      # Print Output
      for input_im_ind in range(output.shape[0]):
          inds = np.argsort(output)[input_im_ind, :]
          print("Image", input_im_ind)
          for i in range(5):
              print("%s: %.3f" % (class_names[inds[-1 - i]], output[input_im_ind, inds[-1 - i]]))
          print()
      
      print("Time: %.3f seconds" % (time.time() - t))
      

      【讨论】:

        【解决方案3】:

        请澄清您所说的“整个数据集”是什么意思。你的意思是将训练集和测试集连接在一起吗?如果是这样,那么该集合在拆分之前位于您的 datalabels 变量中。您可以将它们传递给 sess.run 做这样的事情以获得全部损失。您可能需要稍微调整一下以使索引匹配。

        feed = {data_pl: data, target_pl: labels,...}
        loss = sess.run(tf_loss, feed_dict=feed)
        

        如果您只是想要独立的训练/测试集错误,那么您已经在这样做了,所以只需从最后一个 epoch 运行中获取值。这些是已经完成的行。

        test_loss,predictions,acc_np = sess.run([tf_loss,preds,tf_acc],feed_dict=feed)
        train_loss = sess.run(tf_loss, feed_dict=feed)
        

        【讨论】:

          猜你喜欢
          • 2018-08-13
          • 1970-01-01
          • 2017-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多