#!/usr/bin/python3.6 #python 3 syntax import array as ar import numpy as np import matplotlib.pyplot as plt import h5py import scipy from PIL import Image from scipy import ndimage #from lr_utils import load_dataset #TEST_CASE = True TEST_CASE = False def load_dataset(): train_dataset = h5py.File('datasets/train_catvnoncat.h5', "r") #train_dataset is multi dim array. list or numpy array? train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features. 4D array shape=(209, 64, 64, 3) train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels. 1D array shape =(209,) test_dataset = h5py.File('datasets/test_catvnoncat.h5', "r") test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features. 4D array shape=(50, 64, 64, 3) test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels. 1D array shape =(50,) classes = np.array(test_dataset["list_classes"][:]) # the list of classes. 1D array shape=(2,) = [b'non-cat' b'cat'] print("train = ",train_dataset, "test = ",test_dataset, test_set_y_orig, "classes = ",classes,classes.shape,classes.dtype) print("OLD", train_set_x_orig.shape, train_set_y_orig.shape, test_set_x_orig.shape, test_set_y_orig.shape) 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])) print("NEW", train_set_x_orig.shape, train_set_y_orig.shape, test_set_x_orig.shape, test_set_y_orig.shape) #print("Y = ", train_set_y_orig, test_set_y_orig) return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes def sigmoid(z): ### START CODE HERE ### (≈ 1 line of code) s = 1/(1+np.exp(-z)) ### END CODE HERE ### return s if (TEST_CASE): print ("sigmoid([0, 2]) = " + str(sigmoid(np.array([0,2])))) def initialize_with_zeros(dim): """ This function creates a vector of zeros of shape (dim, 1) for w and initializes b to 0. Argument: dim -- size of the w vector we want (or number of parameters in this case) Returns: w -- initialized vector of shape (dim, 1) b -- initialized scalar (corresponds to the bias) """ ### START CODE HERE ### (≈ 1 line of code) w = np.zeros((dim,1)) b = 0 ### END CODE HERE ### assert(w.shape == (dim, 1)), "shape of w is not dim,1" assert(isinstance(b, float) or isinstance(b, int)) return w, b if (TEST_CASE): dim = 2 w, b = initialize_with_zeros(dim) print ("w = " + str(w)) print ("b = " + str(b)) def propagate(w, b, X, Y): """ Implement the cost function and its gradient for the propagation explained above Arguments: w -- weights, a numpy array of size (num_px * num_px * 3, 1) b -- bias, a scalar X -- data of size (num_px * num_px * 3, number of examples) Y -- true "label" vector (containing 0 if non-cat, 1 if cat) of size (1, number of examples) Return: cost -- negative log-likelihood cost for logistic regression dw -- gradient of the loss with respect to w, thus same shape as w db -- gradient of the loss with respect to b, thus same shape as b Tips: - Write your code step by step for the propagation. np.log(), np.dot() """ m = X.shape[1] # FORWARD PROPAGATION (FROM X TO COST) ### START CODE HERE ### (≈ 2 lines of code) A = sigmoid(np.dot(w.T,X)+b) # compute activation cost = -1/m*(np.dot(Y,np.log(A.T)) + np.dot((1-Y),np.log((1-A).T))) # compute cost ### END CODE HERE ### # BACKWARD PROPAGATION (TO FIND GRAD) ### START CODE HERE ### (≈ 2 lines of code) dw = 1/m*(np.dot(X,(A-Y).T)) db = 1/m*(np.sum(A-Y)) ### END CODE HERE ### assert(dw.shape == w.shape),"shape of dw and w do not match" assert(db.dtype == float) cost = np.squeeze(cost) assert(cost.shape == ()),"cost is not a scalar but a vector" grads = {"dw": dw, "db": db} return grads, cost if (TEST_CASE): w, b, X, Y = np.array([[1.],[2.]]), 2., np.array([[1.,2.,-1.],[3.,4.,-3.2]]), np.array([[1,0,1]]) grads, cost = propagate(w, b, X, Y) print ("dw = " + str(grads["dw"])) print ("db = " + str(grads["db"])) print ("cost = " + str(cost)) # GRADED FUNCTION: optimize def optimize(w, b, X, Y, num_iterations, learning_rate, print_cost = False): """ This function optimizes w and b by running a gradient descent algorithm Arguments: w -- weights, a numpy array of size (num_px * num_px * 3, 1) b -- bias, a scalar X -- data of shape (num_px * num_px * 3, number of examples) Y -- true "label" vector (containing 0 if non-cat, 1 if cat), of shape (1, number of examples) num_iterations -- number of iterations of the optimization loop learning_rate -- learning rate of the gradient descent update rule print_cost -- True to print the loss every 100 steps Returns: params -- dictionary containing the weights w and bias b grads -- dictionary containing the gradients of the weights and bias with respect to the cost function costs -- list of all the costs computed during the optimization, this will be used to plot the learning curve. Tips: You basically need to write down two steps and iterate through them: 1) Calculate the cost and the gradient for the current parameters. Use propagate(). 2) Update the parameters using gradient descent rule for w and b. """ costs = [] for i in range(num_iterations): # Cost and gradient calculation (≈ 1-4 lines of code) ### START CODE HERE ### grads, cost = propagate(w, b, X, Y) ### END CODE HERE ### # Retrieve derivatives from grads dw = grads["dw"] db = grads["db"] # update rule (≈ 2 lines of code) ### START CODE HERE ### w = w - learning_rate*dw b = b - learning_rate*db ### END CODE HERE ### # Record the costs if i % 100 == 0: costs.append(cost) # Print the cost every 100 training iterations if print_cost and i % 100 == 0: print ("Cost after iteration %i: %f" %(i, cost)) params = {"w": w, "b": b} grads = {"dw": dw, "db": db} return params, grads, costs if (TEST_CASE): params, grads, costs = optimize(w, b, X, Y, num_iterations= 100, learning_rate = 0.009, print_cost = True) print ("w = " + str(params["w"])) print ("b = " + str(params["b"])) print ("dw = " + str(grads["dw"])) print ("db = " + str(grads["db"])) # GRADED FUNCTION: predict def predict(w, b, X): ''' Predict whether the label is 0 or 1 using learned logistic regression parameters (w, b) Arguments: w -- weights, a numpy array of size (num_px * num_px * 3, 1) b -- bias, a scalar X -- data of size (num_px * num_px * 3, number of examples) Returns: Y_prediction -- a numpy array (vector) containing all predictions (0/1) for the examples in X ''' print("shape of X = ",X.shape,"shape of w=",w.shape,"shape of X[0]=",X.shape[0],"shape of X[1]=",X.shape[1]) m = X.shape[1] Y_prediction = np.zeros((1,m)) w = w.reshape(X.shape[0], 1) # Compute vector "A" predicting the probabilities of a cat being present in the picture ### START CODE HERE ### (≈ 1 line of code) A = sigmoid(np.dot(w.T,X)+b) ### END CODE HERE ### for i in range(A.shape[1]): # Convert probabilities A[0,i] to actual predictions p[0,i] ### START CODE HERE ### (≈ 4 lines of code) if (A[0,i] > 0.5): Y_prediction[0,i] = 1 else: Y_prediction[0,i] = 0 #if (m==1): # print("i=",i,"A[0,i]=",A[0,i],"Y_pred[0,i]=",Y_prediction[0,i]) ### END CODE HERE ### assert(Y_prediction.shape == (1, m)),"shape of prediction is not 1,m" return Y_prediction, A if (TEST_CASE): w = np.array([[0.1124579],[0.23106775]]) b = -0.3 X = np.array([[1.,-1.1,-3.2],[1.2,2.,0.1]]) print ("predictions = " + str(predict(w, b, X))) # GRADED FUNCTION: model def model(X_train, Y_train, X_test, Y_test, num_iterations = 2000, learning_rate = 0.5, print_cost = False): """ Builds the logistic regression model by calling the function you've implemented previously Arguments: X_train -- training set represented by a numpy array of shape (num_px * num_px * 3, m_train) Y_train -- training labels represented by a numpy array (vector) of shape (1, m_train) X_test -- test set represented by a numpy array of shape (num_px * num_px * 3, m_test) Y_test -- test labels represented by a numpy array (vector) of shape (1, m_test) num_iterations -- hyperparameter representing the number of iterations to optimize the parameters learning_rate -- hyperparameter representing the learning rate used in the update rule of optimize() print_cost -- Set to true to print the cost every 100 iterations Returns: d -- dictionary containing information about the model. """ ### START CODE HERE ### # initialize parameters with zeros (≈ 1 line of code) w, b = initialize_with_zeros(X_train.shape[0]) # Gradient descent (≈ 1 line of code) parameters, grads, costs = optimize(w, b, X_train, Y_train, num_iterations, learning_rate, print_cost) # Retrieve parameters w and b from dictionary "parameters" w = parameters["w"] b = parameters["b"] # Predict test/train set examples (≈ 2 lines of code) Y_prediction_test, A_prediction_test = predict(w, b, X_test) Y_prediction_train, A_prediction_train = predict(w, b, X_train) ### END CODE HERE ### #print #print("train pred A ",A_prediction_train) #print("train pred Y ",Y_prediction_train) #print("train actl Y ",Y_train) #print("test pred A ",A_prediction_test) #print("test pred Y ",Y_prediction_test) #print("test actl Y ",Y_test) # Print train/test Errors print("train accuracy: {} %".format(100 - np.mean(np.abs(Y_prediction_train - Y_train)) * 100)) print("test accuracy: {} %".format(100 - np.mean(np.abs(Y_prediction_test - Y_test)) * 100)) d = {"costs": costs, "Y_prediction_test": Y_prediction_test, "Y_prediction_train" : Y_prediction_train, "w" : w, "b" : b, "learning_rate" : learning_rate, "num_iterations": num_iterations} return d ##################### #start of main program ####################### # Loading the data (cat/non-cat) train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset() # Example of a picture choice = "Y" while (choice == "Y"): index = int(input("Enter index of picture ")) plt.imshow(train_set_x_orig[index]) plt.imshow(test_set_x_orig[index]) plt.show() print ("y = " + str(train_set_y[:, index]) + ", it's a '" + classes[np.squeeze(train_set_y[:, index])].decode("utf-8") + "' picture.") #flatten array of image train_set_x_flatten = np.transpose(train_set_x_orig.reshape(train_set_x_orig.shape[0],train_set_x_orig.shape[1]*train_set_x_orig.shape[2]*train_set_x_orig.shape[3])) test_set_x_flatten = np.transpose(test_set_x_orig.reshape(test_set_x_orig.shape[0],test_set_x_orig.shape[1]*test_set_x_orig.shape[2]*test_set_x_orig.shape[3])) #train_set_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0],-1).T #test_set_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0],-1).T print ("train_set_x_flatten shape: " + str(train_set_x_flatten.shape)) print ("train_set_y shape: " + str(train_set_y.shape)) print ("test_set_x_flatten shape: " + str(test_set_x_flatten.shape)) print ("test_set_y shape: " + str(test_set_y.shape)) print ("sanity check after reshaping: " + str(train_set_x_flatten[0:5,0])) #normalize array train_set_x = train_set_x_flatten/255 test_set_x = test_set_x_flatten/255 #model = run the model on training set to get optimal w,b d = model(train_set_x, train_set_y, test_set_x, test_set_y, num_iterations = 1000, learning_rate = 0.005, print_cost = True) # Example of a picture that was wrongly classified. #index = 1 num_px=64 #plt.imshow(test_set_x[:,index].reshape((num_px, num_px, 3))) #plt.imshow(test_set_x_orig[1]) #print ("y = " + str(test_set_y[0,index]) + ", you predicted that it is a \"" + classes[d["Y_prediction_test"][0,index]].decode("utf-8") + "\" picture.") #plt.show() # Plot learning curve (with costs) costs = np.squeeze(d['costs']) plt.plot(costs) plt.ylabel('cost') plt.xlabel('iterations (per hundreds)') plt.title("Learning rate =" + str(d["learning_rate"])) plt.show() learn_choice = input("Try diff learn rates (Y/N)? ") if(learn_choice == "Y"): learning_rates = [0.01, 0.001, 0.0001] models = {} for i in learning_rates: print ("learning rate is: " + str(i)) models[str(i)] = model(train_set_x, train_set_y, test_set_x, test_set_y, num_iterations = 10000, learning_rate = i, print_cost = False) print ('\n' + "-------------------------------------------------------" + '\n') for i in learning_rates: plt.plot(np.squeeze(models[str(i)]["costs"]), label= str(models[str(i)]["learning_rate"])) plt.ylabel('cost') plt.xlabel('iterations (hundreds)') legend = plt.legend(loc='upper center', shadow=True) frame = legend.get_frame() frame.set_facecolor('0.90') plt.show() #loop to read your own cat/non-cat images image_choice = input("Try diff images (Y/N)? ") if(image_choice == "Y"): num_pic=10 for i in range(1,num_pic+1): ## START CODE HERE ## (PUT YOUR IMAGE NAME) #my_image = "my_image.jpg" # change this to the name of your image file my_image = "cat_ex" + str(i) + ".jpg" ## END CODE HERE ## # We preprocess the image to fit your algorithm. fname = "/home/user/coding/coursera/AI_projects/" + my_image #image = np.array(ndimage.imread(fname, flatten=False)) #image = plt.imread('my_image.jpg') #im = Image.open('my_image.jpg') im = Image.open(fname) image = np.array(im.resize((num_px,num_px))) #returns in H X W X C = 64x64x3 #img = Image.fromarray(image) #print("img size=",img.size) #img.show() #print("image type",type(image),type(image.dtype),image.shape,image) image = image/255 if (i==1): image_arr = image.reshape(1,image.shape[0],image.shape[1],image.shape[2]) print("Orig Image:", image.shape,"New image",image_arr.shape) else: image = image.reshape(1,image.shape[0],image.shape[1],image.shape[2]) image_arr = np.append(image_arr,image,axis=0) print("Orig Image:", image.shape,"New image",image_arr.shape) #my_image = scipy.misc.imresize(image, size=(num_px,num_px)).reshape((1, num_px*num_px*3)).T #my_image = image.reshape(1,train_set_x_orig.shape[1]*train_set_x_orig.shape[2]*train_set_x_orig.shape[3]).T my_image = image_arr.reshape(num_pic,train_set_x_orig.shape[1]*train_set_x_orig.shape[2]*train_set_x_orig.shape[3]).T my_predicted_image, A_predicted_image = predict(d["w"], d["b"], my_image) #try to recover image from array tmp_image = ((my_image.T)[index]).reshape(64,64,3) plt.imshow(tmp_image) #print predictions for test images #print("y = " + str(np.squeeze(my_predicted_image)) + ", your algorithm predicts a \"" + classes[int(np.squeeze(my_predicted_image)),].decode("utf-8") + "\" picture. A=",A_predicted_image) print("prediction A",A_predicted_image) print("prediction Y",my_predicted_image) plt.show() choice=input("continue Y/N? ") #end of pgm print ("Bye")