为了方便大家,我将代码上传至git上,训练正确率和测试正确率比coursera上有所提高。
在计算损失函数时,TensorFlow将原来tf.nn.softmax_cross_entropy_with_logits替换为tf.nn.softmax_cross_entropy_with_logits_v2.我查阅了大量资料,未能找到关于二者区别的文章,TensorFlow版本问题可能导致了最终程序结果与Coursera上有所出入,不过不影响大家学习。训练集和测试集以及cnn_utils包都已上传至git。
https://github.com/CrazyKKK/course4_week1-1
import math import numpy as np import h5py import matplotlib.pyplot as plt import scipy from PIL import Image from scipy import ndimage import tensorflow as tf from tensorflow.python.framework import ops from cnn_utils import * np.random.seed(1) X_train_orig,Y_train_orig,X_test_orig,Y_test_orig,classes = load_dataset() X_train = X_train_orig/255 X_test = X_test_orig/255 Y_train = convert_to_one_hot(Y_train_orig,6).T Y_test = convert_to_one_hot(Y_test_orig,6).T ''' print ("number of training examples = " + str(X_train.shape[0])) print ("number of test examples = " + str(X_test.shape[0])) print ("X_train shape: " + str(X_train.shape)) print ("Y_train shape: " + str(Y_train.shape)) print ("X_test shape: " + str(X_test.shape)) print ("Y_test shape: " + str(Y_test.shape)) ''' conv_layers={} def create_placeholders(n_H0,n_W0,n_C0,n_y): """ Creates the placeholders for the tensorflow session. Arguments: n_H0 -- scalar, height of an input image n_W0 -- scalar, width of an input image n_C0 -- scalar, number of channels of the input n_y -- scalar, number of classes Returns: X -- placeholder for the data input, of shape [None, n_H0, n_W0, n_C0] and dtype "float" Y -- placeholder for the input labels, of shape [None, n_y] and dtype "float" """ X = tf.placeholder(tf.float32, [None, n_H0, n_W0, n_C0]) Y = tf.placeholder(tf.float32, [None, n_y]) return X,Y def initialize_parameters(): """ Initializes weight parameters to build a neural network with tensorflow. The shapes are: W1 : [4, 4, 3, 8] W2 : [2, 2, 8, 16] Returns: parameters -- a dictionary of tensors containing W1, W2 """ tf.set_random_seed(1) # so that your "random" numbers match ours W1 = tf.get_variable('W1', [4 ,4, 3, 8], initializer=tf.contrib.layers.xavier_initializer(seed=0)) W2 = tf.get_variable('W2', [2, 2, 8, 16], initializer=tf.contrib.layers.xavier_initializer(seed=0)) parameters = {"W1":W1, "W2":W2} return parameters ''' tf.reset_default_graph() with tf.Session() as sess_test: parameters = initialize_parameters() init = tf.global_variables_initializer() sess_test.run(init) print("W1 = " + str(parameters["W1"].eval()[1,1,1])) print("W2 = " + str(parameters["W2"].eval()[1, 1, 1])) ''' # GRADED FUNCTION: forward_propagation def forward_propagation(X, parameters): """ Implements the forward propagation for the model: CONV2D -> RELU -> MAXPOOL -> CONV2D -> RELU -> MAXPOOL -> FLATTEN -> FULLYCONNECTED Arguments: X -- input dataset placeholder, of shape (input size, number of examples) parameters -- python dictionary containing your parameters "W1", "W2" 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'] W2 = parameters['W2'] ### START CODE HERE ### # CONV2D: stride of 1, padding 'SAME' Z1 = tf.nn.conv2d(X,W1,strides=[1,1,1,1],padding='SAME') # RELU A1 = tf.nn.relu(Z1) # MAXPOOL: window 8x8, sride 8, padding 'SAME' P1 = tf.nn.max_pool(A1,ksize=[1,8,8,1],strides=[1,8,8,1],padding='SAME') # CONV2D: filters W2, stride 1, padding 'SAME' Z2 = tf.nn.conv2d(P1,W2,strides=[1,1,1,1],padding='SAME') # RELU A2 = tf.nn.relu(Z2) # MAXPOOL: window 4x4, stride 4, padding 'SAME' P2 = tf.nn.max_pool(A2,ksize=[1,4,4,1],strides=[1,4,4,1],padding='SAME') # FLATTEN P2 = tf.contrib.layers.flatten(P2) # FULLY-CONNECTED without non-linear activation function (not not call softmax). # 6 neurons in output layer. Hint: one of the arguments should be "activation_fn=None" Z3 = tf.contrib.layers.fully_connected(P2,6,activation_fn=None) ### END CODE HERE ### return Z3 # GRADED FUNCTION: compute_cost ''' tf.reset_default_graph() with tf.Session() as sess: np.random.seed(1) X,Y = create_placeholders(64,64,3,6) parameters = initialize_parameters() Z3 = forward_propagation(X,parameters) init = tf.global_variables_initializer() sess.run(init) a = sess.run(Z3,{X:np.random.randn(2,64,64,3),Y:np.random.randn(2,6)}) print("Z3 = "+ str(a)) ''' 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 """ cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=Z3,labels=Y)) return cost # GRADED FUNCTION: model ''' tf.reset_default_graph() with tf.Session() as sess: np.random.seed(1) X,Y = create_placeholders(64,64,3,6) parameters = initialize_parameters() Z3 = forward_propagation(X,parameters) cost = compute_cost(Z3,Y) init = tf.global_variables_initializer() sess.run(init) a = sess.run(cost,{X:np.random.randn(4,64,64,3),Y:np.random.randn(4,6)}) print("cost=" + str(a)) ''' ''' ''' # GRADED FUNCTION: model def model(X_train, Y_train, X_test, Y_test, learning_rate = 0.0009, num_epochs = 300, minibatch_size = 64, print_cost = True): """ Implements a three-layer ConvNet in Tensorflow: CONV2D -> RELU -> MAXPOOL -> CONV2D -> RELU -> MAXPOOL -> FLATTEN -> FULLYCONNECTED Arguments: X_train -- training set, of shape (None, 64, 64, 3) Y_train -- test set, of shape (None, n_y = 6) X_test -- training set, of shape (None, 64, 64, 3) Y_test -- test set, of shape (None, n_y = 6) 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: train_accuracy -- real number, accuracy on the train set (X_train) test_accuracy -- real number, testing accuracy on the test set (X_test) 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 results consistent (tensorflow seed) seed = 3 # to keep results consistent (numpy seed) (m, n_H0, n_W0, n_C0) = X_train.shape n_y = Y_train.shape[1] costs = [] # To keep track of the cost # Create Placeholders of the correct shape ### START CODE HERE ### (1 line) X, Y = create_placeholders(n_H0,n_W0,n_C0,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 that minimizes the cost. ### START CODE HERE ### (1 line) optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost) ### END CODE HERE ### # Initialize all the variables globally init = tf.global_variables_initializer() # 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): minibatch_cost = 0. num_minibatches = int(m / minibatch_size) # number of minibatches of size minibatch_size in the train set seed = seed + 1 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) _ , temp_cost = sess.run([optimizer,cost],feed_dict={X:minibatch_X,Y:minibatch_Y}) ### END CODE HERE ### minibatch_cost += temp_cost / num_minibatches # Print the cost every epoch if print_cost == True and epoch % 5 == 0: print ("Cost after epoch %i: %f" % (epoch, minibatch_cost)) if print_cost == True and epoch % 1 == 0: costs.append(minibatch_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() # Calculate the correct predictions predict_op = tf.argmax(Z3, 1) correct_prediction = tf.equal(predict_op, tf.argmax(Y, 1)) # Calculate accuracy on the test set accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) print(accuracy) train_accuracy = accuracy.eval({X: X_train, Y: Y_train}) test_accuracy = accuracy.eval({X: X_test, Y: Y_test}) print("Train Accuracy:", train_accuracy) print("Test Accuracy:", test_accuracy) return train_accuracy, test_accuracy, parameters _, _, parameters = model(X_train, Y_train, X_test, Y_test) 程序运行结果: Cost after epoch 0: 1.976589 Cost after epoch 5: 1.895094 Cost after epoch 10: 1.884952 Cost after epoch 15: 1.862152 Cost after epoch 20: 1.792553 Cost after epoch 25: 1.659748 Cost after epoch 30: 1.439652 Cost after epoch 35: 1.210028 Cost after epoch 40: 1.059912 Cost after epoch 45: 0.950599 Cost after epoch 50: 0.864589 Cost after epoch 55: 0.779795 Cost after epoch 60: 0.721491 Cost after epoch 65: 0.659299 Cost after epoch 70: 0.622481 Cost after epoch 75: 0.587786 Cost after epoch 80: 0.553721 Cost after epoch 85: 0.515339 Cost after epoch 90: 0.481323 Cost after epoch 95: 0.464154 Cost after epoch 100: 0.450780 Cost after epoch 105: 0.419089 Cost after epoch 110: 0.393920 Cost after epoch 115: 0.381122 Cost after epoch 120: 0.375946 Cost after epoch 125: 0.361885 Cost after epoch 130: 0.344810 Cost after epoch 135: 0.328714 Cost after epoch 140: 0.321064 Cost after epoch 145: 0.299867 Cost after epoch 150: 0.298625 Cost after epoch 155: 0.284655 Cost after epoch 160: 0.269399 Cost after epoch 165: 0.264294 Cost after epoch 170: 0.269712 Cost after epoch 175: 0.267915 Cost after epoch 180: 0.242613 Cost after epoch 185: 0.228068 Cost after epoch 190: 0.218832 Cost after epoch 195: 0.213510 Cost after epoch 200: 0.205735 Cost after epoch 205: 0.200092 Cost after epoch 210: 0.196989 Cost after epoch 215: 0.187289 Cost after epoch 220: 0.181605 Cost after epoch 225: 0.186336 Cost after epoch 230: 0.177865 Cost after epoch 235: 0.174295 Cost after epoch 240: 0.165915 Cost after epoch 245: 0.168665 Cost after epoch 250: 0.151124 Cost after epoch 255: 0.157855 Cost after epoch 260: 0.157312 Cost after epoch 265: 0.150373 Cost after epoch 270: 0.148940 Cost after epoch 275: 0.139157 Cost after epoch 280: 0.136293 Cost after epoch 285: 0.127223 Cost after epoch 290: 0.132367 Cost after epoch 295: 0.118375 Tensor("Mean_1:0", shape=(), dtype=float32) Train Accuracy: 0.9759259 Test Accuracy: 0.89166665 Process finished with exit code 0