在Tensor流上保存经过训练的模型

时间:2018-12-05 10:08:33

标签: python-3.x tensorflow

我想保存训练有素的模型,以便可以将其用于新的观察。 这就是我训练模型的方式。

def train_model(自我,火车,测试,学习率= 0.0001,num_epochs = 16,minibatch_size = 32,print_cost = True,graph_filename ='costs'):

    # Ensure that model can be rerun without overwriting tf variables
    ops.reset_default_graph()
    # For reproducibility
    tf.set_random_seed(42)
    seed = 42
    # Get input and output shapes
    (n_x, m) = train.images.T.shape
    n_y = train.labels.T.shape[0]

    costs = []

    # Create placeholders of shape (n_x, n_y)
    X, Y = self.create_placeholders(n_x, n_y)
    # Initialize parameters
    parameters = self.initialize_parameters()

    # Forward propagation
    Z3 = self.forward_propagation(X, parameters)
    # Cost function
    cost = self.compute_cost(Z3, Y)
    # Backpropagation (using Adam optimizer)
    optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)

    # Initialize variables
    init = tf.global_variables_initializer()

    # Start session to compute Tensorflow graph
    with tf.Session() as sess:

        # Run initialization
        sess.run(init)

        # Training loop
        for epoch in range(num_epochs):

            epoch_cost = 0.
            num_minibatches = int(m / minibatch_size)
            seed = seed + 1

            for i in range(num_minibatches):

                # Get next batch of training data and labels
                minibatch_X, minibatch_Y = train.next_batch(minibatch_size)

                # Execute optimizer and cost function
                _, minibatch_cost = sess.run([optimizer, cost], feed_dict={X: minibatch_X.T, Y: minibatch_Y.T})

                # Update epoch cost
                epoch_cost += minibatch_cost / num_minibatches

            # Print the cost every epoch
            if print_cost == True:
                print("Cost after epoch {epoch_num}: {cost}".format(epoch_num=epoch, cost=epoch_cost))
                costs.append(epoch_cost)

        # Plot costs
        plt.figure(figsize=(16,5))
        plt.plot(np.squeeze(costs), color='#2A688B')
        plt.xlim(0, num_epochs-1)
        plt.ylabel("cost")
        plt.xlabel("iterations")
        plt.title("learning rate = {rate}".format(rate=learning_rate))
        plt.savefig(graph_filename, dpi=300)
        plt.show()

        # Save parameters
        parameters = sess.run(parameters)
        print("Parameters have been trained!")

        # Calculate correct predictions
        correct_prediction = tf.equal(tf.argmax(Z3), tf.argmax(Y))

        # Calculate accuracy on test set
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

        print ("Train Accuracy:", accuracy.eval({X: train.images.T, Y: train.labels.T}))
        print ("Test Accuracy:", accuracy.eval({X: test.images.T, Y: test.labels.T}))

    return parameters

我知道我可以使用tf.train.saver保存占位符。但是我也打算保存计算图。欢迎对此提供任何帮助。

0 个答案:

没有答案