美文网首页
将训练好的神经网络保存下来在另一个文件中载入后进行预测

将训练好的神经网络保存下来在另一个文件中载入后进行预测

作者: w蕾丝 | 来源:发表于2018-06-29 08:35 被阅读0次

    注意这里是将训练好的神经网络拿出来进行预测(使用),而不是测试,测试可与训练在一个文件中进行,当然也可像这样载入网络和训练数据来测试。

    tensorflow_tutorial.py文件---训练神经网络

    #!/usr/bin/env python
    # coding=utf-8
    import math
    import numpy as np
    import h5py
    import matplotlib.pyplot as plt
    import tensorflow as tf
    from tensorflow.python.framework import ops
    from tf_utils import load_dataset, random_mini_batches, convert_to_one_hot, predict
    import scipy
    from PIL import Image
    from scipy import ndimage
    # Loading the dataset
    X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()
    
    # Flatten the training and test images
    X_train_flatten = X_train_orig.reshape(X_train_orig.shape[0], -1).T
    X_test_flatten = X_test_orig.reshape(X_test_orig.shape[0], -1).T
    # Normalize image vectors
    X_train = X_train_flatten/255.
    X_test = X_test_flatten/255.
    # Convert training and test labels to one hot matrices,每一列代表一张图片label的ont hot vector
    Y_train = convert_to_one_hot(Y_train_orig, 6)
    Y_test = convert_to_one_hot(Y_test_orig, 6)
    
    
    def create_placeholders(n_x, n_y):
        """
        Creates the placeholders for the tensorflow session.
    
        Arguments:
        n_x -- scalar, size of an image vector (num_px * num_px = 64 * 64 * 3 = 12288)
        n_y -- scalar, number of classes (from 0 to 5, so -> 6)
    
        Returns:
        X -- placeholder for the data input, of shape [n_x, None] and dtype "float"
        Y -- placeholder for the input labels, of shape [n_y, None] and dtype "float"
    
        Tips:
        - You will use None because it let's us be flexible on the number of examples you will for the placeholders.
          In fact, the number of examples during test/train is different.
        """
    
        ### START CODE HERE ### (approx. 2 lines)
        X = tf.placeholder(tf.float32,shape=(n_x,None))
        Y = tf.placeholder(tf.float32,shape=(n_y,None))
        ### END CODE HERE ###
    
        return X, Y
    
    
    def get_weight(shape):
        w=tf.Variable(tf.truncated_normal(shape,stddev=0.1))
        return w
    
    def get_bias(shape):
        b=tf.Variable(tf.zeros(shape))
        return b
    def initialize_parameters():
        """
        Initializes parameters to build a neural network with tensorflow. The shapes are:
                            W1 : [25, 12288]
                            b1 : [25, 1]
                            W2 : [12, 25]
                            b2 : [12, 1]
                            W3 : [6, 12]
                            b3 : [6, 1]
    
        Returns:
        parameters -- a dictionary of tensors containing W1, b1, W2, b2, W3, b3
        """
    
        tf.set_random_seed(1)  # so that your "random" numbers match ours
    
        ### START CODE HERE ### (approx. 6 lines of code)
        W1 = get_weight([25,12288])
        b1 = get_bias([25,1])
        W2 = get_weight([12,25])
        b2 = get_bias([12,1])
        W3 = get_weight([6,12])
        b3 = get_bias([6,1])
        ### END CODE HERE ###
    
        parameters = {"W1": W1,
                      "b1": b1,
                      "W2": W2,
                      "b2": b2,
                      "W3": W3,
                      "b3": b3}
    
        return parameters
    
    
    def forward_propagation(X, parameters):
        """
        Implements the forward propagation for the model: LINEAR -> RELU -> LINEAR -> RELU -> LINEAR -> SOFTMAX
    
        Arguments:
        X -- input dataset placeholder, of shape (input size, number of examples)
        parameters -- python dictionary containing your parameters "W1", "b1", "W2", "b2", "W3", "b3"
                      the shapes are given in initialize_parameters
    
        Returns:
        Z3 -- the output of the last LINEAR unit
        """
    
        # Retrieve the parameters from the dictionary "parameters"
        W1 = parameters['W1']
        b1 = parameters['b1']
        W2 = parameters['W2']
        b2 = parameters['b2']
        W3 = parameters['W3']
        b3 = parameters['b3']
    
        ### START CODE HERE ### (approx. 5 lines)              # Numpy Equivalents:
        Z1 = tf.matmul(W1,X)+b1  # Z1 = np.dot(W1, X) + b1
        A1 = tf.nn.relu(Z1)  # A1 = relu(Z1)
        Z2 = tf.matmul(W2,A1)+b2   # Z2 = np.dot(W2, a1) + b2
        A2 = tf.nn.relu(Z2)  # A2 = relu(Z2)
        Z3 = tf.matmul(W3,A2)+b3  # Z3 = np.dot(W3,Z2) + b3
        ### END CODE HERE ###
    
        return Z3
    
    
    # GRADED FUNCTION: compute_cost
    
    def compute_cost(Z3, Y):
        """
        Computes the cost
    
        Arguments:
        Z3 -- output of forward propagation (output of the last LINEAR unit), of shape (6, number of examples)
        Y -- "true" labels vector placeholder, same shape as Z3
    
        Returns:
        cost - Tensor of the cost function
        """
    
        # to fit the tensorflow requirement for tf.nn.softmax_cross_entropy_with_logits(...,...)
        logits = tf.transpose(Z3)
        labels = tf.transpose(Y)
    
        ### START CODE HERE ### (1 line of code)
        cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = logits, labels = labels))
        ### END CODE HERE ###
    
        return cost
    
    
    def model(X_train, Y_train, X_test, Y_test, learning_rate=0.0001,
              num_epochs=1500, minibatch_size=32, print_cost=True):
        """
        Implements a three-layer tensorflow neural network: LINEAR->RELU->LINEAR->RELU->LINEAR->SOFTMAX.
    
        Arguments:
        X_train -- training set, of shape (input size = 12288, number of training examples = 1080)
        Y_train -- test set, of shape (output size = 6, number of training examples = 1080)
        X_test -- training set, of shape (input size = 12288, number of training examples = 120)
        Y_test -- test set, of shape (output size = 6, number of test examples = 120)
        learning_rate -- learning rate of the optimization
        num_epochs -- number of epochs of the optimization loop
        minibatch_size -- size of a minibatch
        print_cost -- True to print the cost every 100 epochs
    
        Returns:
        parameters -- parameters learnt by the model. They can then be used to predict.
        """
    
        ops.reset_default_graph()  # to be able to rerun the model without overwriting tf variables
        tf.set_random_seed(1)  # to keep consistent results
        seed = 3  # to keep consistent results
        (n_x, m) = X_train.shape  # (n_x: input size, m : number of examples in the train set)
        n_y = Y_train.shape[0]  # n_y : output size
        costs = []  # To keep track of the cost
    
        # Create Placeholders of shape (n_x, n_y)
        ### START CODE HERE ### (1 line)
        X, Y = create_placeholders(n_x,n_y)
        ### END CODE HERE ###
    
        # Initialize parameters
        ### START CODE HERE ### (1 line)
        parameters = initialize_parameters()
        ### END CODE HERE ###
    
        # Forward propagation: Build the forward propagation in the tensorflow graph
        ### START CODE HERE ### (1 line)
        Z3 = forward_propagation(X,parameters)
        ### END CODE HERE ###
    
        # Cost function: Add cost function to tensorflow graph
        ### START CODE HERE ### (1 line)
        cost = compute_cost(Z3,Y)
        ### END CODE HERE ###
    
        # Backpropagation: Define the tensorflow optimizer. Use an AdamOptimizer.
        ### START CODE HERE ### (1 line)
        optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
        ### END CODE HERE ###
    
        # Initialize all the variables
        init = tf.global_variables_initializer()
        # 实例化Saver对象,max_to_keep=1表示只想保存最终模型
        # 默认max_to_keep=5,保存最近的5个模型
        saver=tf.train.Saver(max_to_keep=1)
    
        # Start the session to compute the tensorflow graph
        with tf.Session() as sess:
    
            # Run the initialization
            sess.run(init)
    
            # Do the training loop
            for epoch in range(num_epochs):
    
                epoch_cost = 0.  # Defines a cost related to an epoch
                num_minibatches = int(m / minibatch_size)  # number of minibatches of size minibatch_size in the train set
                seed = seed + 1
                # 将总的训练数据随机分成m/minibatch_size个minibatch
                # 由于每个epoch的随机种子在递增(都不同了),所以每个epoch的训练数据的划分是不同的
                minibatches = random_mini_batches(X_train, Y_train, minibatch_size, seed)
    
                for minibatch in minibatches:
                    # Select a minibatch
                    (minibatch_X, minibatch_Y) = minibatch
    
                    # IMPORTANT: The line that runs the graph on a minibatch.
                    # Run the session to execute the "optimizer" and the "cost", the feedict should contain a minibatch for (X,Y).
                    ### START CODE HERE ### (1 line)
                    _, minibatch_cost = sess.run((optimizer,cost),feed_dict={X:minibatch_X,Y:minibatch_Y})
                    ### END CODE HERE ###
    
                    epoch_cost += minibatch_cost / num_minibatches
                saver.save(sess,'./model/my_model',global_step=num_epochs)
    
                # Print the cost every epoch
                if print_cost == True and epoch % 100 == 0:
                    print("Cost after epoch %i: %f" % (epoch, epoch_cost))
                if print_cost == True and epoch % 5 == 0:
                    costs.append(epoch_cost)
    
            # plot the cost
            plt.plot(np.squeeze(costs))
            plt.ylabel('cost')
            plt.xlabel('iterations (per tens)')
            plt.title("Learning rate =" + str(learning_rate))
            plt.show()
    
            # lets save the parameters in a variable
    
            print("Parameters have been trained!")
    
            # Calculate the correct predictions
            correct_prediction = tf.equal(tf.argmax(Z3), tf.argmax(Y))
    
            # Calculate accuracy on the test set
            accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    
            print("Train Accuracy:", accuracy.eval({X: X_train, Y: Y_train}))
            print("Test Accuracy:", accuracy.eval({X: X_test, Y: Y_test}))
    if __name__ == '__main__':
        model(X_train, Y_train, X_test, Y_test)
    

    tf_utils.py----辅助训练神经网络的文件

    import h5py
    import numpy as np
    import tensorflow as tf
    import math
    
    def load_dataset():
        train_dataset = h5py.File('datasets/train_signs.h5', "r")
        train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features
        train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels
    
        test_dataset = h5py.File('datasets/test_signs.h5', "r")
        test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features
        test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels
    
        classes = np.array(test_dataset["list_classes"][:]) # the list of classes
        
        train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))
        test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))
        
        return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes
    
    
    def random_mini_batches(X, Y, mini_batch_size = 64, seed = 0):
        m = X.shape[1]                  # number of training examples
        mini_batches = []
        np.random.seed(seed)
        
        # Step 1: Shuffle (X, Y)
        permutation = list(np.random.permutation(m))
        shuffled_X = X[:, permutation]
        shuffled_Y = Y[:, permutation].reshape((Y.shape[0],m))
    
        # Step 2: Partition (shuffled_X, shuffled_Y). Minus the end case.
        num_complete_minibatches = math.floor(m/mini_batch_size) # number of mini batches of size mini_batch_size in your partitionning
        for k in range(0, num_complete_minibatches):
            mini_batch_X = shuffled_X[:, k * mini_batch_size : k * mini_batch_size + mini_batch_size]
            mini_batch_Y = shuffled_Y[:, k * mini_batch_size : k * mini_batch_size + mini_batch_size]
            mini_batch = (mini_batch_X, mini_batch_Y)
            mini_batches.append(mini_batch)
        
        # Handling the end case (last mini-batch < mini_batch_size)
        if m % mini_batch_size != 0:
            mini_batch_X = shuffled_X[:, num_complete_minibatches * mini_batch_size : m]
            mini_batch_Y = shuffled_Y[:, num_complete_minibatches * mini_batch_size : m]
            mini_batch = (mini_batch_X, mini_batch_Y)
            mini_batches.append(mini_batch)
        
        return mini_batches
    
    def convert_to_one_hot(Y, C):
        Y = np.eye(C)[Y.reshape(-1)].T
        return Y
    
    
    def predict(X, parameters):
        
        W1 = tf.convert_to_tensor(parameters["W1"])
        b1 = tf.convert_to_tensor(parameters["b1"])
        W2 = tf.convert_to_tensor(parameters["W2"])
        b2 = tf.convert_to_tensor(parameters["b2"])
        W3 = tf.convert_to_tensor(parameters["W3"])
        b3 = tf.convert_to_tensor(parameters["b3"])
        
        params = {"W1": W1,
                  "b1": b1,
                  "W2": W2,
                  "b2": b2,
                  "W3": W3,
                  "b3": b3}
        
        x = tf.placeholder("float", [12288, 1]) #这里是预测,即只输入一张图片进去预测其类别,所以样本数为‘1’
        
        z3 = forward_propagation_for_predict(x, params)
        p = tf.argmax(z3)
        
        sess = tf.Session()
        prediction = sess.run(p, feed_dict = {x: X})
            
        return prediction
    
    def forward_propagation_for_predict(X, parameters):
        
        # Retrieve the parameters from the dictionary "parameters" 
        W1 = parameters['W1']
        b1 = parameters['b1']
        W2 = parameters['W2']
        b2 = parameters['b2']
        W3 = parameters['W3']
        b3 = parameters['b3'] 
                                                               # Numpy Equivalents:
        Z1 = tf.add(tf.matmul(W1, X), b1)                      # Z1 = np.dot(W1, X) + b1
        A1 = tf.nn.relu(Z1)                                    # A1 = relu(Z1)
        Z2 = tf.add(tf.matmul(W2, A1), b2)                     # Z2 = np.dot(W2, a1) + b2
        A2 = tf.nn.relu(Z2)                                    # A2 = relu(Z2)
        Z3 = tf.add(tf.matmul(W3, A2), b3)                     # Z3 = np.dot(W3,Z2) + b3
        
        return Z3
        
        
    

    predict.py---载入模型进行预测

    import numpy as np
    import matplotlib.pyplot as plt
    import tensorflow as tf
    from tensorflow.python.framework import ops
    import scipy
    from PIL import Image
    from scipy import ndimage
    import tensorflow_tutorial
    
    # 载入待预测的图片
    my_image = "thumbs_up.jpg"
    fname = "images/" + my_image
    # 将图片转换成我们训练的神经网络输入的格式
    image = np.array(ndimage.imread(fname, flatten=False))
    my_image = scipy.misc.imresize(image, size=(64,64)).reshape((1, 64*64*3)).T
    
    with tf.Graph().as_default() as g:
        # 给送入训练好的神经网络进行预测的图片数据占位
        x = tf.placeholder(tf.float32, shape=(12288,None))
        #初始化神经网络变量
        parameters=tensorflow_tutorial.initialize_parameters()                
        #建立计算图(前向传播)
        Z3=tensorflow_tutorial.forward_propagation(x,parameters)
        # 预测图片类别
        p=tf.argmax(Z3)
    
        # 实例化 saver 对象
        saver = tf.train.Saver()
    
        with tf.Session() as sess:
            # 将加载指定路径下的ckpt,若模型存在,则加载模型到当前对话
            ckpt = tf.train.get_checkpoint_state('./model')
            saver.restore(sess, ckpt.model_checkpoint_path)
            # 进行预测
            prediction=sess.run(p,feed_dict={x:my_image})
            print(prediction)# 打印出预测结果
    

    相关文章

      网友评论

          本文标题:将训练好的神经网络保存下来在另一个文件中载入后进行预测

          本文链接:https://www.haomeiwen.com/subject/kfuoyftx.html