y_hat = tf.constant(36, name='y_hat')# Define y_hat constant. Set to 36.y = tf.constant(39, name='y')# Define y. Set to 39loss = tf.Variable((y - y_hat)**2, name='loss')# Create a variable for the lossinit = tf.global_variables_initializer()# When init is run later (session.run(init)),# the loss variable will be initialized and ready to be computedwith tf.Session()as session:# Create a session and print the outputsession.run(init)# Initializes the variablesprint(session.run(loss))# Prints the loss
輸出:(36?39)2=9(36-39)^2 = 9(36?39)2=9
9
TensorFlow編程步驟:
創建Tensors(變量)(尚未執行的)
寫出操作方法(訓練之類的)
初始化Tensors
創建Session
運行Session(運行上面的操作方法)
a = tf.constant(2)
b = tf.constant(10)
c = tf.multiply(a,b)print(c)
# Change the value of x in the feed_dictx = tf.placeholder(tf.int64, name ='xa')# 定義變量x,稍后才能賦值print(sess.run(2* x, feed_dict ={x:3}))# 運行(計算圖,給placeholder變量喂數據)
sess.close()
輸出:6
1.1 線性函數
計算 WX+bWX + bWX+b,WWW 是矩陣,bbb 是向量
X = tf.constant(np.random.randn(3,1), name = "X")
tf.matmul(..., ...) 矩陣乘法
tf.add(..., ...) 加法
np.random.randn(...) 隨機初始化(n 正態分布)
# GRADED FUNCTION: linear_functiondeflinear_function():"""Implements a linear function: Initializes W to be a random tensor of shape (4,3)Initializes X to be a random tensor of shape (3,1)Initializes b to be a random tensor of shape (4,1)Returns: result -- runs the session for Y = WX + b """np.random.seed(1)### START CODE HERE ### (4 lines of code)X = tf.constant(np.random.randn(3,1), name='X')W = tf.constant(np.random.randn(4,3), name='W')b = tf.constant(np.random.randn(4,1), name='b')Y = tf.matmul(W,X)+b# Y = tf.add(tf.matmul(W,X), b) # 也可以# Y = W*X+b # 錯誤寫法!!!!!!!!!!### END CODE HERE ### # Create the session using tf.Session() and run it with sess.run(...) on the variable you want to calculate### START CODE HERE ###sess = tf.Session()result = sess.run(Y)### END CODE HERE ### # close the session sess.close()return result
1.2 計算 sigmoid
定義 placeholder變量 x
定義操作tf.sigmoid(),計算sigmoid值
在session里運行
Method 1:
sess = tf.Session()# Run the variables initialization (if needed), run the operations
result = sess.run(..., feed_dict ={...})
sess.close()# Close the session
Method 2: with不用自己寫close,比較方便
with tf.Session()as sess:# run the variables initialization (if needed), run the operationsresult = sess.run(..., feed_dict ={...})# This takes care of closing the session for you :)# GRADED FUNCTION: sigmoiddefsigmoid(z):"""Computes the sigmoid of zArguments:z -- input value, scalar or vectorReturns: results -- the sigmoid of z"""### START CODE HERE ### ( approx. 4 lines of code)# Create a placeholder for x. Name it 'x'.x = tf.placeholder(tf.float32, name='x')# compute sigmoid(x)sigmoid = tf.sigmoid(x)# Create a session, and run it. # Please use the method 2 explained above. # You should use a feed_dict to pass z's value to x. with tf.Session()as sess:# Run session and call the output "result"result = sess.run(sigmoid,feed_dict={x:z})### END CODE HERE ###return result
# GRADED FUNCTION: costdefcost(logits, labels):"""Computes the cost using the sigmoid cross entropyArguments:logits -- vector containing z, output of the last linear unit (before the final sigmoid activation)labels -- vector of labels y (1 or 0) Note: What we've been calling "z" and "y" in this class are respectively called "logits" and "labels" in the TensorFlow documentation. So logits will feed into z, and labels into y. Returns:cost -- runs the session of the cost (formula (2))"""### START CODE HERE ### # Create the placeholders for "logits" (z) and "labels" (y) (approx. 2 lines)z = tf.placeholder(tf.float32, name='z')y = tf.placeholder(tf.float32, name='y')# Use the loss function (approx. 1 line)cost = tf.nn.sigmoid_cross_entropy_with_logits(logits=z, labels=y)# Create a session (approx. 1 line). See method 1 above.sess = tf.Session()# Run the session (approx. 1 line).cost = sess.run(cost, feed_dict={z:logits, y:labels})# Close the session (approx. 1 line). See method 1 above.sess.close()### END CODE HERE ###return cost
1.4 One_Hot 編碼
比如有標簽 y 向量,有4種標簽值,要進行編碼:
tf.one_hot(labels, depth, axis)
# GRADED FUNCTION: one_hot_matrixdefone_hot_matrix(labels, C):"""Creates a matrix where the i-th row corresponds to the ith class number and the jth columncorresponds to the jth training example. So if example j had a label i. Then entry (i,j) will be 1. Arguments:labels -- vector containing the labels C -- number of classes, the depth of the one hot dimensionReturns: one_hot -- one hot matrix"""### START CODE HERE #### Create a tf.constant equal to C (depth), name it 'C'. (approx. 1 line)C = tf.constant(C, name='C')# Use tf.one_hot, be careful with the axis (approx. 1 line)one_hot_matrix = tf.one_hot(labels, C, axis=0)# 不寫 axis默認為 1, 0 是列向# Create the session (approx. 1 line)sess = tf.Session()# Run the session (approx. 1 line)one_hot = sess.run(one_hot_matrix)# Close the session (approx. 1 line). See method 1 above.sess.close()### END CODE HERE ###return one_hot
1.5 用0,1初始化
tf.ones(shape),tf.zeros(shape)
# GRADED FUNCTION: onesdefones(shape):"""Creates an array of ones of dimension shapeArguments:shape -- shape of the array you want to createReturns: ones -- array containing only ones"""### START CODE HERE #### Create "ones" tensor using tf.ones(...). (approx. 1 line)ones = tf.ones(shape)# Create the session (approx. 1 line)sess = tf.Session()# Run the session to compute 'ones' (approx. 1 line)ones = sess.run(ones)# Close the session (approx. 1 line). See method 1 above.sess.close()### END CODE HERE ###return ones
2. 用TensorFlow建立你的第一個神經網絡
實現TF模型步驟:
創建計算圖
運行圖
2.0 數字手勢識別
訓練集:1080張圖片(64*64像素)(0-5手勢,每種180張)
測試集:120張圖片(64*64像素)(0-5手勢,每種20張)
加載數據集,看一看
# Loading the dataset
X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()# Example of a picture
index =1
plt.imshow(X_train_orig[index])print("y = "+str(np.squeeze(Y_train_orig[:, index])))
歸一化像素值(除以255),對標簽進行 one_hot 編碼
# 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
Y_train = convert_to_one_hot(Y_train_orig,6)
Y_test = convert_to_one_hot(Y_test_orig,6)print("number of training examples = "+str(X_train.shape[1]))print("number of test examples = "+str(X_test.shape[1]))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))
輸出:(注意維度正確與否)
number of training examples =1080
number of test examples =120
X_train shape:(12288,1080)# 64*64*3 = 12288
Y_train shape:(6,1080)
X_test shape:(12288,120)
Y_test shape:(6,120)
下面建立的模型結構為:LINEAR -> RELU -> LINEAR -> RELU -> LINEAR -> SOFTMAX (多于2種輸出,將 sigmoid 輸出改成 softmax 輸出)
2.1 創建 placeholder
創建 X,Y 的 placeholder,一會運行的時候,給他 feed 訓練數據
# GRADED FUNCTION: create_placeholdersdefcreate_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), name='X')Y = tf.placeholder(tf.float32, shape=(n_y,None), name='Y')### END CODE HERE ###return X, Y
# GRADED FUNCTION: compute_cost defcompute_cost(Z3, Y):"""Computes the costArguments: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 Z3Returns: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
_ , c = sess.run([optimizer, cost], feed_dict={X: minibatch_X, Y: minibatch_Y})
2.6 建立完整的TF模型
使用上面的函數
使用 Adam 優化器 optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
defmodel(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 optimizationnum_epochs -- number of epochs of the optimization loopminibatch_size -- size of a minibatchprint_cost -- True to print the cost every 100 epochsReturns: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 variablestf.set_random_seed(1)# to keep consistent resultsseed =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 sizecosts =[]# 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=learning_rate).minimize(cost)### END CODE HERE #### 初始化所有變量init = tf.global_variables_initializer()# Start the session to compute the tensorflow graphwith tf.Session()as sess:# Run the initializationsess.run(init)# Do the training loopfor epoch inrange(num_epochs):epoch_cost =0.# Defines a cost related to an epochnum_minibatches =int(m / minibatch_size)# 多少個minibatch子集seed = seed +1minibatches = 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# Print the cost every epochif print_cost ==Trueand epoch %100==0:print("Cost after epoch %i: %f"%(epoch, epoch_cost))if print_cost ==Trueand epoch %5==0:costs.append(epoch_cost)# plot the costplt.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 variableparameters = sess.run(parameters)print("Parameters have been trained!")# Calculate the correct predictionscorrect_prediction = tf.equal(tf.argmax(Z3), tf.argmax(Y))# Calculate accuracy on the test setaccuracy = 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}))return parameters
運行模型進行訓練
parameters = model(X_train, Y_train, X_test, Y_test)
Cost after epoch 0:1.855702
Cost after epoch 100:1.017255
Cost after epoch 200:0.733184
Cost after epoch 300:0.573071
Cost after epoch 400:0.468573
Cost after epoch 500:0.381228
Cost after epoch 600:0.313815
Cost after epoch 700:0.253708
Cost after epoch 800:0.203900
Cost after epoch 900:0.166453
Cost after epoch 1000:0.146636
Cost after epoch 1100:0.107279
Cost after epoch 1200:0.086699
Cost after epoch 1300:0.059341
Cost after epoch 1400:0.052289
Parameters have been trained!
Train Accuracy:0.9990741
Test Accuracy:0.725
import scipy
from PIL import Image
from scipy import ndimage## START CODE HERE ## (PUT YOUR IMAGE NAME)
my_image ="thumbs_up.jpg"## END CODE HERE ### We preprocess your image to fit your algorithm.
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
my_image_prediction = predict(my_image, parameters)plt.imshow(image)print("Your algorithm predicts: y = "+str(np.squeeze(my_image_prediction)))
Your algorithm predicts: y =3