1. TensorFlow model

  1. import math
  2. import numpy as np
  3. import h5py
  4. import matplotlib.pyplot as plt
  5. import scipy
  6. from PIL import Image
  7. from scipy import ndimage
  8. import tensorflow as tf
  9. from tensorflow.python.framework import ops
  10. from cnn_utils import *
  11. %matplotlib inline
  12. np.random.seed(1)

导入数据

  1. # Loading the data (signs)
  2. X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()

the SIGNS dataset is a collection of 6 signs representing numbers from 0 to 5.

展示数据

  1. # Example of a picture
  2. index = 6
  3. plt.imshow(X_train_orig[index])
  4. print ("y = " + str(np.squeeze(Y_train_orig[:, index])))

y = 2

数据的维度

  1. X_train = X_train_orig/255.
  2. X_test = X_test_orig/255.
  3. Y_train = convert_to_one_hot(Y_train_orig, 6).T
  4. Y_test = convert_to_one_hot(Y_test_orig, 6).T
  5. print ("number of training examples = " + str(X_train.shape[0]))
  6. print ("number of test examples = " + str(X_test.shape[0]))
  7. print ("X_train shape: " + str(X_train.shape))
  8. print ("Y_train shape: " + str(Y_train.shape))
  9. print ("X_test shape: " + str(X_test.shape))
  10. print ("Y_test shape: " + str(Y_test.shape))
  11. conv_layers = {}

number of training examples = 1080

number of test examples = 120

X_train shape: (1080, 64, 64, 3)

Y_train shape: (1080, 6)

X_test shape: (120, 64, 64, 3)

Y_test shape: (120, 6)

1.1 Create placeholders

TensorFlow requires that you create placeholders for the input data that will be fed into the model when running the session.

Exercise: Implement the function below to create placeholders for the input image X and the output Y.

  • You should not define the number of training examples for the moment.

  • To do so, you could use "None" as the batch size, it will give you the flexibility to choose it later.

  • Hence X should be of dimension [None, n_H0, n_W0, n_C0] and Y should be of dimension [None, n_y]. Hint.

  1. # GRADED FUNCTION: create_placeholders
  2. def create_placeholders(n_H0, n_W0, n_C0, n_y):
  3. """
  4. Creates the placeholders for the tensorflow session.
  5. Arguments:
  6. n_H0 -- scalar, height of an input image
  7. n_W0 -- scalar, width of an input image
  8. n_C0 -- scalar, number of channels of the input
  9. n_y -- scalar, number of classes
  10. Returns:
  11. X -- placeholder for the data input, of shape [None, n_H0, n_W0, n_C0] and dtype "float"
  12. Y -- placeholder for the input labels, of shape [None, n_y] and dtype "float"
  13. """
  14. ### START CODE HERE ### (≈2 lines)
  15. X = tf.placeholder(tf.float32, shape=[None, n_H0, n_W0, n_C0])
  16. Y = tf.placeholder(tf.float32, shape=[None, n_y])
  17. ### END CODE HERE ###
  18. return X, Y

测试:

  1. X, Y = create_placeholders(64, 64, 3, 6)
  2. print ("X = " + str(X))
  3. print ("Y = " + str(Y))

输出:

X = Tensor("Placeholder:0", shape=(?, 64, 64, 3), dtype=float32)

Y = Tensor("Placeholder_1:0", shape=(?, 6), dtype=float32)

1.2 Initialize parameters

  • You will initialize weights/filters \(W1\) and \(W2\) using tf.contrib.layers.xavier_initializer(seed = 0).

  • You don't need to worry about bias variables as you will soon see that TensorFlow functions take care of the bias.

  • Note also that you will only initialize the weights/filters for the conv2d functions. TensorFlow initializes the layers for the fully connected part automatically. We will talk more about that later in this assignment.

Exercise: Implement initialize_parameters(). The dimensions for each group of filters are provided below. Reminder - to initialize a parameter \(W\) of shape [1,2,3,4] in Tensorflow, use:

  1. W = tf.get_variable("W", [1,2,3,4], initializer = ...)

More Info.

  1. # GRADED FUNCTION: initialize_parameters
  2. def initialize_parameters():
  3. """
  4. Initializes weight parameters to build a neural network with tensorflow. The shapes are:
  5. W1 : [4, 4, 3, 8]
  6. W2 : [2, 2, 8, 16]
  7. Returns:
  8. parameters -- a dictionary of tensors containing W1, W2
  9. """
  10. tf.set_random_seed(1) # so that your "random" numbers match ours
  11. ### START CODE HERE ### (approx. 2 lines of code)
  12. # (f, f, n_C_prev, n_C)
  13. W1 = tf.get_variable('W1',[4, 4, 3, 8], initializer = tf.contrib.layers.xavier_initializer(seed = 0))
  14. W2 = tf.get_variable('W2',[2, 2, 8, 16], initializer = tf.contrib.layers.xavier_initializer(seed = 0))
  15. ### END CODE HERE ###
  16. parameters = {"W1": W1,
  17. "W2": W2}
  18. return parameters

测试

  1. tf.reset_default_graph()
  2. with tf.Session() as sess_test:
  3. parameters = initialize_parameters()
  4. init = tf.global_variables_initializer()
  5. sess_test.run(init)
  6. print("W1 = " + str(parameters["W1"].eval()[1,1,1]))
  7. print("W2 = " + str(parameters["W2"].eval()[1,1,1]))

1.2 Forward propagation

In TensorFlow, there are built-in functions that carry out the convolution steps for you.

  • tf.nn.conv2d(X,W1, strides = [1,s,s,1], padding = 'SAME'): given an input \(X\) and a group of filters \(W1\), this function convolves \(W1\)'s filters on X. The third input ([1,f,f,1]) represents the strides for each dimension of the input (m, n_H_prev, n_W_prev, n_C_prev). You can read the full documentation here

  • tf.nn.max_pool(A, ksize = [1,f,f,1], strides = [1,s,s,1], padding = 'SAME'): given an input A, this function uses a window of size (f, f) and strides of size (s, s) to carry out max pooling over each window. You can read the full documentation here

  • tf.nn.relu(Z1): computes the elementwise ReLU of Z1 (which can be any shape). You can read the full documentation here.

  • tf.contrib.layers.flatten(P): given an input P, this function flattens each example into a 1D vector it while maintaining the batch-size. It returns a flattened tensor with shape [batch_size, k]. You can read the full documentation here.

  • tf.contrib.layers.fully_connected(F, num_outputs): given a the flattened input F, it returns the output computed using a fully connected layer. You can read the full documentation here.

In the last function above (tf.contrib.layers.fully_connected), the fully connected layer automatically initializes weights in the graph and keeps on training them as you train the model. Hence, you did not need to initialize those weights when initializing the parameters.

Exercise:

Implement the forward_propagation function below to build the following model: CONV2D -> RELU -> MAXPOOL -> CONV2D -> RELU -> MAXPOOL -> FLATTEN -> FULLYCONNECTED. You should use the functions above.

In detail, we will use the following parameters for all the steps:

  • Conv2D: stride 1, padding is "SAME"

  • ReLU

  • Max pool: Use an 8 by 8 filter size and an 8 by 8 stride, padding is "SAME"

  • Conv2D: stride 1, padding is "SAME"

  • ReLU

  • Max pool: Use a 4 by 4 filter size and a 4 by 4 stride, padding is "SAME"

  • Flatten the previous output.

  • FULLYCONNECTED (FC) layer: Apply a fully connected layer without an non-linear activation function. Do not call the softmax here. This will result in 6 neurons in the output layer, which then get passed later to a softmax. In TensorFlow, the softmax and cost function are lumped together into a single function, which you'll call in a different function when computing the cost.

  1. # GRADED FUNCTION: forward_propagation
  2. def forward_propagation(X, parameters):
  3. """
  4. Implements the forward propagation for the model:
  5. CONV2D -> RELU -> MAXPOOL -> CONV2D -> RELU -> MAXPOOL -> FLATTEN -> FULLYCONNECTED
  6. Arguments:
  7. X -- input dataset placeholder, of shape (input size, number of examples)
  8. parameters -- python dictionary containing your parameters "W1", "W2"
  9. the shapes are given in initialize_parameters
  10. Returns:
  11. Z3 -- the output of the last LINEAR unit
  12. """
  13. # Retrieve the parameters from the dictionary "parameters"
  14. W1 = parameters['W1']
  15. W2 = parameters['W2']
  16. ### START CODE HERE ###
  17. # CONV2D: stride of 1, padding 'SAME'
  18. Z1 = tf.nn.conv2d(X, W1, strides = [1, 1, 1, 1], padding = 'SAME')
  19. # RELU
  20. A1 = tf.nn.relu(Z1)
  21. # MAXPOOL: window 8x8, sride 8, padding 'SAME'
  22. P1 = tf.nn.max_pool(A1, ksize = [1,8,8,1], strides = [1,8,8,1], padding = 'SAME')
  23. # CONV2D: filters W2, stride 1, padding 'SAME'
  24. Z2 = tf.nn.conv2d(P1,W2, strides = [1,1,1,1], padding = 'SAME')
  25. # RELU
  26. A2 = tf.nn.relu(Z2)
  27. # MAXPOOL: window 4x4, stride 4, padding 'SAME'
  28. P2 = tf.nn.max_pool(A2, ksize = [1,4,4,1], strides = [1,4,4,1], padding = 'SAME')
  29. # FLATTEN
  30. P2 = tf.contrib.layers.flatten(P2)
  31. # FULLY-CONNECTED without non-linear activation function (not not call softmax).
  32. # 6 neurons in output layer. Hint: one of the arguments should be "activation_fn=None"
  33. Z3 = tf.contrib.layers.fully_connected(P2, 6, activation_fn=None)
  34. ### END CODE HERE ###
  35. return Z3

测试:

  1. tf.reset_default_graph()
  2. with tf.Session() as sess:
  3. np.random.seed(1)
  4. X, Y = create_placeholders(64, 64, 3, 6)
  5. parameters = initialize_parameters()
  6. Z3 = forward_propagation(X, parameters)
  7. init = tf.global_variables_initializer()
  8. sess.run(init)
  9. a = sess.run(Z3, {X: np.random.randn(2,64,64,3), Y: np.random.randn(2,6)})
  10. print("Z3 = " + str(a))

1.3 Compute cost

Implement the compute cost function below. You might find these two functions helpful:

  • tf.nn.softmax_cross_entropy_with_logits(logits = Z3, labels = Y):

    • computes the softmax entropy loss. This function both computes the softmax activation function as well as the resulting loss.

    • You can check the full documentation here.

  • tf.reduce_mean: computes the mean of elements across dimensions of a tensor.

    • Use this to sum the losses over all the examples to get the overall cost. You can check the full documentation here.

** Exercise**: Compute the cost below using the function above.

  1. # GRADED FUNCTION: compute_cost
  2. def compute_cost(Z3, Y):
  3. """
  4. Computes the cost
  5. Arguments:
  6. Z3 -- output of forward propagation (output of the last LINEAR unit), of shape (6, number of examples)
  7. Y -- "true" labels vector placeholder, same shape as Z3
  8. Returns:
  9. cost - Tensor of the cost function
  10. """
  11. ### START CODE HERE ### (1 line of code)
  12. cost = tf.nn.softmax_cross_entropy_with_logits(logits = Z3, labels = Y)
  13. cost = tf.reduce_mean(cost)
  14. ### END CODE HERE ###
  15. return cost

测试:

  1. tf.reset_default_graph()
  2. with tf.Session() as sess:
  3. np.random.seed(1)
  4. X, Y = create_placeholders(64, 64, 3, 6)
  5. parameters = initialize_parameters()
  6. Z3 = forward_propagation(X, parameters)
  7. cost = compute_cost(Z3, Y)
  8. init = tf.global_variables_initializer()
  9. sess.run(init)
  10. a = sess.run(cost, {X: np.random.randn(4,64,64,3), Y: np.random.randn(4,6)})
  11. print("cost = " + str(a))

cost = 2.91034

1.4 Model

Finally you will merge the helper functions you implemented above to build a model. You will train it on the SIGNS dataset.

You have implemented random_mini_batches() in the Optimization programming assignment of course 2. Remember that this function returns a list of mini-batches.

Exercise: Complete the function below.

The model below should:

  • create placeholders
  • initialize parameters
  • forward propagate
  • compute the cost
  • create an optimizer

Finally you will create a session and run a for loop for num_epochs, get the mini-batches, and then for each mini-batch you will optimize the function. Hint for initializing the variables

  1. # GRADED FUNCTION: model
  2. def model(X_train, Y_train, X_test, Y_test, learning_rate = 0.009,
  3. num_epochs = 100, minibatch_size = 64, print_cost = True):
  4. """
  5. Implements a three-layer ConvNet in Tensorflow:
  6. CONV2D -> RELU -> MAXPOOL -> CONV2D -> RELU -> MAXPOOL -> FLATTEN -> FULLYCONNECTED
  7. Arguments:
  8. X_train -- training set, of shape (None, 64, 64, 3)
  9. Y_train -- test set, of shape (None, n_y = 6)
  10. X_test -- training set, of shape (None, 64, 64, 3)
  11. Y_test -- test set, of shape (None, n_y = 6)
  12. learning_rate -- learning rate of the optimization
  13. num_epochs -- number of epochs of the optimization loop
  14. minibatch_size -- size of a minibatch
  15. print_cost -- True to print the cost every 100 epochs
  16. Returns:
  17. train_accuracy -- real number, accuracy on the train set (X_train)
  18. test_accuracy -- real number, testing accuracy on the test set (X_test)
  19. parameters -- parameters learnt by the model. They can then be used to predict.
  20. """
  21. ops.reset_default_graph() # to be able to rerun the model without overwriting tf variables
  22. tf.set_random_seed(1) # to keep results consistent (tensorflow seed)
  23. seed = 3 # to keep results consistent (numpy seed)
  24. (m, n_H0, n_W0, n_C0) = X_train.shape
  25. n_y = Y_train.shape[1]
  26. costs = [] # To keep track of the cost
  27. # Create Placeholders of the correct shape
  28. ### START CODE HERE ### (1 line)
  29. X, Y = create_placeholders(n_H0, n_W0, n_C0, n_y)
  30. ### END CODE HERE ###
  31. # Initialize parameters
  32. ### START CODE HERE ### (1 line)
  33. parameters = initialize_parameters()
  34. ### END CODE HERE ###
  35. # Forward propagation: Build the forward propagation in the tensorflow graph
  36. ### START CODE HERE ### (1 line)
  37. Z3 = forward_propagation(X, parameters)
  38. ### END CODE HERE ###
  39. # Cost function: Add cost function to tensorflow graph
  40. ### START CODE HERE ### (1 line)
  41. cost = compute_cost(Z3, Y)
  42. ### END CODE HERE ###
  43. # Backpropagation: Define the tensorflow optimizer. Use an AdamOptimizer that minimizes the cost.
  44. ### START CODE HERE ### (1 line)
  45. optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
  46. ### END CODE HERE ###
  47. # Initialize all the variables globally
  48. init = tf.global_variables_initializer()
  49. # Start the session to compute the tensorflow graph
  50. with tf.Session() as sess:
  51. # Run the initialization
  52. sess.run(init)
  53. # Do the training loop
  54. for epoch in range(num_epochs):
  55. minibatch_cost = 0.
  56. num_minibatches = int(m / minibatch_size) # number of minibatches of size minibatch_size in the train set
  57. seed = seed + 1
  58. minibatches = random_mini_batches(X_train, Y_train, minibatch_size, seed)
  59. for minibatch in minibatches:
  60. # Select a minibatch
  61. (minibatch_X, minibatch_Y) = minibatch
  62. # IMPORTANT: The line that runs the graph on a minibatch.
  63. # Run the session to execute the optimizer and the cost, the feedict should contain a minibatch for (X,Y).
  64. ### START CODE HERE ### (1 line)
  65. _ , temp_cost = sess.run([optimizer, cost], feed_dict={X: minibatch_X, Y: minibatch_Y})
  66. ### END CODE HERE ###
  67. minibatch_cost += temp_cost / num_minibatches
  68. # Print the cost every epoch
  69. if print_cost == True and epoch % 5 == 0:
  70. print ("Cost after epoch %i: %f" % (epoch, minibatch_cost))
  71. if print_cost == True and epoch % 1 == 0:
  72. costs.append(minibatch_cost)
  73. # plot the cost
  74. plt.plot(np.squeeze(costs))
  75. plt.ylabel('cost')
  76. plt.xlabel('iterations (per tens)')
  77. plt.title("Learning rate =" + str(learning_rate))
  78. plt.show()
  79. # Calculate the correct predictions
  80. predict_op = tf.argmax(Z3, 1)
  81. correct_prediction = tf.equal(predict_op, tf.argmax(Y, 1))
  82. # Calculate accuracy on the test set
  83. accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
  84. print(accuracy)
  85. train_accuracy = accuracy.eval({X: X_train, Y: Y_train})
  86. test_accuracy = accuracy.eval({X: X_test, Y: Y_test})
  87. print("Train Accuracy:", train_accuracy)
  88. print("Test Accuracy:", test_accuracy)
  89. return train_accuracy, test_accuracy, parameters

测试:

  1. _, _, parameters = model(X_train, Y_train, X_test, Y_test)

Cost after epoch 0: 1.917920

Cost after epoch 5: 1.532475

Cost after epoch 10: 1.014804

Cost after epoch 15: 0.885137

Cost after epoch 20: 0.766963

Cost after epoch 25: 0.651208

Cost after epoch 30: 0.613356

Cost after epoch 35: 0.605931

Cost after epoch 40: 0.534713

Cost after epoch 45: 0.551402

Cost after epoch 50: 0.496976

Cost after epoch 55: 0.454438

Cost after epoch 60: 0.455496

Cost after epoch 65: 0.458359

Cost after epoch 70: 0.450040

Cost after epoch 75: 0.410687

Cost after epoch 80: 0.469005

Cost after epoch 85: 0.389253

Cost after epoch 90: 0.363808

Cost after epoch 95: 0.376132

Tensor("Mean_1:0", shape=(), dtype=float32)

Train Accuracy: 0.86851853

Test Accuracy: 0.73333335

Convolutional Neural Network-week1编程题(TensorFlow实现手势数字识别)的更多相关文章

  1. Convolutional Neural Network in TensorFlow

    翻译自Build a Convolutional Neural Network using Estimators TensorFlow的layer模块提供了一个轻松构建神经网络的高端API,它提供了创 ...

  2. Tensorflow - Implement for a Convolutional Neural Network on MNIST.

    Coding according to TensorFlow 官方文档中文版 中文注释源于:tf.truncated_normal与tf.random_normal TF-卷积函数 tf.nn.con ...

  3. tensorflow MNIST Convolutional Neural Network

    tensorflow MNIST Convolutional Neural Network MNIST CNN 包含的几个部分: Weight Initialization Convolution a ...

  4. 卷积神经网络(Convolutional Neural Network,CNN)

    全连接神经网络(Fully connected neural network)处理图像最大的问题在于全连接层的参数太多.参数增多除了导致计算速度减慢,还很容易导致过拟合问题.所以需要一个更合理的神经网 ...

  5. ISSCC 2017论文导读 Session 14 Deep Learning Processors,A 2.9TOPS/W Deep Convolutional Neural Network

    最近ISSCC2017大会刚刚举行,看了关于Deep Learning处理器的Session 14,有一些不错的东西,在这里记录一下. A 2.9TOPS/W Deep Convolutional N ...

  6. ISSCC 2017论文导读 Session 14 Deep Learning Processors,A 2.9TOPS/W Deep Convolutional Neural Network SOC

    最近ISSCC2017大会刚刚举行,看了关于Deep Learning处理器的Session 14,有一些不错的东西,在这里记录一下. A 2.9TOPS/W Deep Convolutional N ...

  7. 【转载】 卷积神经网络(Convolutional Neural Network,CNN)

    作者:wuliytTaotao 出处:https://www.cnblogs.com/wuliytTaotao/ 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,欢迎 ...

  8. 论文阅读(Weilin Huang——【TIP2016】Text-Attentional Convolutional Neural Network for Scene Text Detection)

    Weilin Huang--[TIP2015]Text-Attentional Convolutional Neural Network for Scene Text Detection) 目录 作者 ...

  9. 卷积神经网络(Convolutional Neural Network, CNN)简析

    目录 1 神经网络 2 卷积神经网络 2.1 局部感知 2.2 参数共享 2.3 多卷积核 2.4 Down-pooling 2.5 多层卷积 3 ImageNet-2010网络结构 4 DeepID ...

随机推荐

  1. TOMCAT WEB请求乱码

    post乱码: 原因: ​ 对于POST方式,它采用的编码是由页面来决定的即ContentType("text/html; charset=GBK").当通过点击页面的submit ...

  2. Pytest 系列(29)- 详解 allure.dynamic 动态生成功能

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 @allure.title  ...

  3. Identity简单授权

    详情访问官方文档 以下代码将访问权限限制为任何经过身份验证的用户,这里为控制器级 [Authorize] public class AccountController : Controller { p ...

  4. C# List集合类常用操作:三、查找

    List集合查询数据 List<Employees> employees = new List<Employees>(); employees.Add(new Employee ...

  5. RIAD配置

    一.RIAD 磁盘阵列介绍 二.阵列卡介绍 三.案例举例   一.RAID磁盘阵列介绍 是Redundant Array of Independent Disks的缩写,中文简称为独立冗余磁盘阵列 把 ...

  6. angularjs $http.get 和 $http.post 传递参数

    $http.get请求数据的格式 $http.get(URL,{ params: { "id":id } }) .success(function(response, status ...

  7. netty系列之:在netty中处理CORS

    目录 简介 服务端的CORS配置 CorsConfigBuilder CorsHandler netty对cors的支持 总结 简介 CORS的全称是跨域资源共享,他是一个基于HTTP-header检 ...

  8. 整理STC延时函数时遇到的玄学问题

    void Delay { unsigned char i, j; i = 11; j = 190; do { while (--j); } while (--i); } void Delay { un ...

  9. mysql5.5根据条件进行排序查询 TP5

    用到了 order by if 和 count 使用的是TP5.0 $sql = Db::name('teacher') ->alias('t') ->join('user u', 'u. ...

  10. Jmeter扩展组件开发(9) - 解决空指针问题

    问题分析 上一节https://www.cnblogs.com/gltou/p/14967005.html功能描述内容为空,导致Jmeter报空指针 CODE List desc = new Arra ...