1. 程式人生 > >[ MOOC課程學習 ] 人工智慧實踐:Tensorflow筆記_CH7_2 Lenet-5程式碼講解

[ MOOC課程學習 ] 人工智慧實踐:Tensorflow筆記_CH7_2 Lenet-5程式碼講解

Lenet-5程式碼講解

Lenet 神經網路是 Yann LeCun 等人在 1998 年提出的,該神經網路充分考慮影象的相關性。

1. Lenet 神經網路結構為:

1.輸入為 32*32*1 的圖片大小,為單通道的輸入;
2.進行卷積,卷積核大小為 5*5*1,個數為 6,步長為 1,非全零填充模式;
3.將卷積結果通過非線性啟用函式;
4.進行池化,池化大小為 2*2,步長為 1,全零填充模式;
5.進行卷積,卷積核大小為 5*5*6,個數為 16,步長為 1,非全零填充模式;
6.將卷積結果通過非線性啟用函式;
7.進行池化,池化大小為 2*2,步長為 1,全零填充模式;
8.全連線層進行 10 分類。

2. Lenet 神經網路的結構圖及特徵提取過程如下所示:

Lenet-5

3. 根據 Lenet 神經網路的結構可得,Lenet 神經網路具有如下特點:

1.卷積(Conv)、非線性啟用函式(sigmoid)、池化(ave-pooling)相互交替;
2.層與層之間稀疏連線,減少計算複雜度。

4. 對 Lenet 神經網路進行微調,使其適應 Mnist 資料集:

由於 Mnist 資料集中圖片大小為 28*28*1 的灰度圖片,而 Lenet 神經網路的輸入為 32*32*1,故需要對 Lenet 神經網路進行微調。
1.輸入為 28*28*1 的圖片大小,為單通道的輸入;
2.進行卷積,卷積核大小為 5*5*1,個數為 32,步長為 1,全零填充模式;
3.將卷積結果通過非線性啟用函式;
4.進行池化,池化大小為 2*2,步長為 2,全零填充模式;
5.進行卷積,卷積核大小為 5*5*32,個數為 64,步長為 1,全零填充模式;
6.將卷積結果通過非線性啟用函式;
7.進行池化,池化大小為 2*2,步長為 2,全零填充模式;
8.全連線層,進行 10 分類。

5. Lenet 進行微調後的結構如下所示:

Lenet5-mnist

6. Lenet 神經網路在 Mnist 資料集上的實現:

主要分為三個部分:
前向傳播過程(mnist_lenet5_forward.py)、
反向傳播過程(mnist_lenet5_backword.py)、
測試過程(mnist_lenet5_test.py)。

1.前向傳播過程(mnist_lenet5_forward.py)實現對網路中引數和偏置的初始化、定義卷積結構和池化結構、定義前向傳播過程。具體程式碼如下所示:

#coding:utf-8
import tensorflow as tf
IMAGE_SIZE = 28
NUM_CHANNELS = 1 CONV1_SIZE = 5 CONV1_KERNEL_NUM = 32 CONV2_SIZE = 5 CONV2_KERNEL_NUM = 64 FC_SIZE = 512 OUTPUT_NODE = 10 def get_weight(shape, regularizer): w = tf.Variable(tf.truncated_normal(shape, stddev=0.1)) if regularizer != None: tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regularizer)(w)) return w def get_bias(shape): b = tf.Variable(tf.zeros(shape)) return b def conv2d(x, w): return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME') def max_pool_2x2(x): return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') def forward(x, train, regularizer): conv1_w = get_weight([CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_KERNEL_NUM], regularizer) conv1_b = get_bias([CONV1_KERNEL_NUM]) conv1 = conv2d(x, conv1_w) relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_b)) pool1 = max_pool_2x2(relu1) conv2_w = get_weight([CONV2_SIZE, CONV2_SIZE, CONV1_KERNEL_NUM, CONV2_KERNEL_NUM], regularizer) conv2_b = get_bias([CONV2_KERNEL_NUM]) conv2 = conv2d(pool1, conv2_w) relu2 = tf.nn.relu(tf.nn.bias_add(conv2, conv2_b)) pool2 = max_pool_2x2(relu2) pool_shape = pool2.get_shape().as_list() nodes = pool_shape[1] * pool_shape[2] * pool_shape[3] reshaped = tf.reshape(pool2, [pool_shape[0], nodes]) fc1_w = get_weight([nodes, FC_SIZE], regularizer) fc1_b = get_bias([FC_SIZE]) fc1 = tf.nn.relu(tf.matmul(reshaped, fc1_w) + fc1_b) if train: fc1 = tf.nn.dropout(fc1, 0.5) fc2_w = get_weight([FC_SIZE, OUTPUT_NODE], regularizer) fc2_b = get_bias([OUTPUT_NODE]) y = tf.matmul(fc1, fc2_w) + fc2_b return y

(1) 圖片大小即每張圖片解析度為 28*28,故 IMAGE_SIZE 取值為 28;
Mnist 資料集為灰度圖,故輸入圖片通道數NUM_CHANNELS 取值為 1;
第一層卷積核大小為 5,卷積核個數為 32,故 CONV1_SIZE 取值為5,CONV1_KERNEL_NUM 取值為 32;
第二層卷積核大小為 5,卷積核個數為 64,故 CONV2_SIZE 取值為 5, CONV2_KERNEL_NUM為 64;
全連線層第一層為 512 個神經元,全連線層第二層為 10 個神經元,故FC_SIZE 取值為512,OUTPUT_NODE 取值為 10,實現 10 分類輸出。
(2) tf.nn.relu()用來實現非線性啟用,相比 sigmoid 和 tanh 函式,relu 函式可以實現快速的收斂。
(3) pool_shape = pool2.get_shape().as_list(): 根據 get_shape()函式得到 pool2 輸出矩陣的維度,並存入 list 中。其中,pool_shape[0]為一個 batch 值。
nodes = pool_shape[1] * pool_shape[2] * pool_shape[3]從 list 中依次取出矩陣的長寬及深度,並求三者的乘積,得到矩陣被拉長後的長度。
reshaped = tf.reshape(pool2, [pool_shape[0], nodes])將 pool2 轉換為一個 batch 的向量再傳入後續的全連線。get_shape() 函式用於獲取一個張量的維度,並且輸出張量每個維度上面的值。
例如:

A = tf.random_normal(shape=[3,4])
print(A.get_shape())
# 輸出結果為: (3, 4)

(4) if train: fc1 = tf.nn.dropout(fc1, 0.5)
如果是訓練階段,則對該層輸出使用 dropout,也就是隨機的將該層輸出中的一半神經元置為無效,是為了避免過擬合而設定的,一般只在全連線層中使用。
2.反向傳播過程(mnist_lenet5_backward.py),完成訓練神經網路的引數。具體程式碼如下所示:

#coding:utf-8
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import mnist_lenet5_forward
import os
import numpy as np

BATCH_SIZE = 100
REGULARIZER = 0.0001
TRAIN = True
LR = 0.005
LR_DECAY_RATE = 0.99
EMA_DECAY = 0.99

MODEL_SAVE_PATH = './model/'
MODEL_NAME = 'mnist_model'
STEPS = 50000

def backward(mnist):
    x = tf.placeholder(tf.float32, [
        BATCH_SIZE,
        mnist_lenet5_forward.IMAGE_SIZE,
        mnist_lenet5_forward.IMAGE_SIZE,
        mnist_lenet5_forward.NUM_CHANNELS])

    y_ = tf.placeholder(tf.float32, [None, mnist_lenet5_forward.OUTPUT_NODE])
    y = mnist_lenet5_forward.forward(x, TRAIN, REGULARIZER)

    global_step = tf.Variable(0, trainable=False)

    ce = tf.nn.sparse_softmax_cross_entropy_with_logits(
        labels=tf.argmax(y_, 1),
        logits=y
    )
    cem = tf.reduce_mean(ce)
    loss = cem + tf.add_n(tf.get_collection('losses'))

    lr = tf.train.exponential_decay(
        learning_rate=LR,
        global_step=global_step,
        decay_steps=mnist.train.num_examples / BATCH_SIZE,
        decay_rate=LR_DECAY_RATE,
        staircase=True
    )
    train_step = tf.train.GradientDescentOptimizer(lr).minimize(loss, global_step)

    ema = tf.train.ExponentialMovingAverage(decay=EMA_DECAY, num_updates=global_step)
    ema_op = ema.apply(tf.trainable_variables())

    with tf.control_dependencies([train_step, ema_op]):
        train_op = tf.no_op('train')

    saver = tf.train.Saver()

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        ckpt = tf.train.get_checkpoint_state(MODEL_SAVE_PATH)
        if ckpt and ckpt.model_checkpoint_path:
            saver.restore(sess, ckpt.model_checkpoint_path)
        for i in range(STEPS):
            xs, ys = mnist.train.next_batch(BATCH_SIZE)
            xs_reshaped = np.reshape(xs,(
                BATCH_SIZE,
                mnist_lenet5_forward.IMAGE_SIZE,
                mnist_lenet5_forward.IMAGE_SIZE,
                mnist_lenet5_forward.NUM_CHANNELS
            ))
            _, loss_v, step = sess.run([train_op, loss, global_step], feed_dict={x: xs_reshaped, y_: ys})
            if i % 100 == 0:
                print('After {} training steps, loss on training batch is {}'.format(step, loss_v))
                saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME), global_step)


def main():
    mnist = input_data.read_data_sets('./data/', one_hot=True)
    backward(mnist)

if __name__ == '__main__':
    main()

3.測試過程(mnist_lenet5_test.py),對 Mnist 資料集中的測試資料進行預測,測試模型準確率。具體程式碼如下所示:

#coding:utf-8
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import mnist_lenet5_forward
import mnist_lenet5_backward
import numpy as np
import time

TEST_INTERVAL_SECS = 5

REGULARIZER = None
TRAIN = False



def test(mnist):
    with tf.Graph().as_default() as g: #
        x = tf.placeholder(tf.float32, [
            mnist.test.num_examples,
            mnist_lenet5_forward.IMAGE_SIZE,
            mnist_lenet5_forward.IMAGE_SIZE,
            mnist_lenet5_forward.NUM_CHANNELS])

        y_ = tf.placeholder(tf.float32, [None, mnist_lenet5_forward.OUTPUT_NODE])
        y = mnist_lenet5_forward.forward(x, TRAIN, REGULARIZER)

        ema = tf.train.ExponentialMovingAverage(decay=mnist_lenet5_backward.EMA_DECAY)
        ema_restore = ema.variables_to_restore()
        saver = tf.train.Saver(ema_restore)

        correct_num = tf.equal(tf.argmax(y_, 1), tf.argmax(y, 1)) #
        acc = tf.reduce_mean(tf.cast(correct_num, tf.float32)) #

        while True:
            with tf.Session() as sess:
                ckpt = tf.train.get_checkpoint_state(mnist_lenet5_backward.MODEL_SAVE_PATH)
                if ckpt and ckpt.model_checkpoint_path:
                    saver.restore(sess, ckpt.model_checkpoint_path)
                    global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1] #
                    xs = mnist.test.images
                    ys = mnist.test.labels
                    xs_reshaped = np.reshape(xs,(
                        mnist.test.num_examples,
                        mnist_lenet5_forward.IMAGE_SIZE,
                        mnist_lenet5_forward.IMAGE_SIZE,
                        mnist_lenet5_forward.NUM_CHANNELS
                    ))
                    acc_val = sess.run(acc, feed_dict={x: xs_reshaped, y_: ys})
                    print('After {} training steps, acc on test if {}.'.format(global_step, acc_val))
                else:
                    print('No checkpoint file found.')
                    return
            time.sleep(TEST_INTERVAL_SECS)


def main():
    mnist = input_data.read_data_sets('./data/', one_hot=True)
    test(mnist)

if __name__ == '__main__':
    main()

相關推薦

[ MOOC課程學習 ] 人工智慧實踐Tensorflow筆記_CH7_2 Lenet-5程式碼講解

Lenet-5程式碼講解 Lenet 神經網路是 Yann LeCun 等人在 1998 年提出的,該神經網路充分考慮影象的相關性。 1. Lenet 神經網路結構為: 1.輸入為 32*32*1 的圖片大小,為單通道的輸入; 2.進行卷積,卷積核大

[ MOOC課程學習 ] 人工智慧實踐Tensorflow筆記_CH6_2 製作資料集

製作資料集 tfrecords 檔案: (1) tfrecords: 是一種二進位制檔案,可先將圖片和標籤製作成該格式的檔案。使用 tfrecords 進行資料讀取,會提高記憶體利用率。 (2) tf.train.Example: 用來儲存訓練資料。訓練

中國大學MOOC-人工智慧實踐Tensorflow筆記-課程筆記 Chapter5

學習課程時的個人筆記記錄。具體課程情況可以點選連結檢視。(這裡推一波中國大學MOOC,很好的學習平臺,質量高,種類全,想要學習的話很有用的)** 本篇是第五章的學習筆記,第四章的可以點選我閱讀. 前三章的可以點選我閱讀. Chapter 5 全連線網路基礎

人工智慧實踐TensorFlow筆記學習(四)—— 神經網路優化

神經網路優化 大綱4.1 損失函式4.2 學習率4.3 滑動平均4.4 正則化4.5 神經網路搭建八股目標掌握神經網路優化方法4.1 損失函式神經元模型:用數學公式表示為:,f為啟用函式。神經網路是以神經元為基本單元構成的。啟用函式:引入非線性啟用因素,提高模型的表達力。常用

人工智慧實踐TensorFlow筆記學習(七)—— 卷積神經網路基礎

大綱7.1 卷積神經網路7.2  lenet5程式碼講解目標掌握卷積神經網路的搭建方法7.1 卷積神經網路全連線 NN:每個神經元與前後相鄰層的每一個神經元都有連線關係,輸入是特徵,輸出為預測的結果。引數個數:(前層X後層+後層)  一張解析度僅僅是28x28的黑白影象,就有

人工智慧實踐TensorFlow筆記學習(五)—— 全連線網路基礎

MNIST資料集輸出手寫數字識別準確率大綱5.1 MNIST資料集5.2 模組化搭建神經網路5.3 手寫數字識別準確率輸出目標利用MNIST資料集鞏固模組化搭建神經網路的八股,實踐前向傳播和反向傳播過程,編寫測試程式輸出手寫數字識別準確率。5.1 MNIST資料集MNIST資

人工智慧實踐Tensorflow筆記(完整版)

  入門課程,比較基礎   第一講 帶著大家梳理人工智慧領域的基本概念:比如什麼是人工智慧、什麼機器學習、什麼是深度學習,他們的發展歷史是什麼,能用他們做什麼。課後,助教會帶領大家安裝Ubuntu系統、Python直譯器 和 Tensorflow環境,把同學們的電腦進行改造

人工智慧實踐Tensorflow筆記(一)

import tensorflow as tf a=tf.constant([1.0,2.0]) b=tf.constant([3.0,4.0]) result=a+b print(result) #Tensor("add:0", shape=(2,), dtype=floa

20180929 北京大學 人工智能實踐Tensorflow筆記

智能 ima 16px class 技術 flow spa get ont 北京大學 人工智能實踐:Tensorflow筆記 https://www.bilibili.com/video/av22530538/?p=13

20180929 北京大學 人工智能實踐Tensorflow筆記03

鏈接 mage 圖片 flow bubuko video image 人工 bsp 更改的程序部分如下: 另: 難?????????????見鏈接: https://www.bilibili.com/video/av22530

20180929 北京大學 人工智能實踐Tensorflow筆記06

.com 分享 inf 智能 flow 人工智能 圖片 北京 技術分享 20180929 北京大學 人工智能實踐:Tensorflow筆記06

20180929 北京大學 人工智能實踐Tensorflow筆記07

分享圖片 9.png nbsp 實踐 tensor src 17. http info (完)20180929 北京大學 人工智能實踐:Tensorflow筆記07

人工智慧Tensorflow筆記-Ubuntu入門基礎(1)

檢視當前路徑:   pwd 查檔當前目錄下的內容: ls 在當前目錄下新建資料夾:mkdir python   (意思是在當前目錄下新建名為python的資料夾) 進入某個目錄:cd 目錄名 ,例如:cd python,即進入了剛才新建

TensorFlow+Keras深度學習人工智慧實踐應用》林大貴版-解析

參考部落格: 【Keras-CNN】CIFAR-10 https://blog.csdn.net/bryant_meng/article/details/81077196#1_Data_preprocessing_12 目錄:https://blog.csdn.net/b

分布式學習最佳實踐從分布式系統的特征開始(附思維導圖)

擴展 問題 sca ref 調度 這也 集中 技術 park     我的探索歷程   這一部分,與分布式不大相關,記錄的是我是如何在分布式學習這條道路上摸索的,不感興趣的讀者請直接跳到下一章。   過去的一年,我在分布式學習這條道路上苦苦徘徊,始終沒有找到一個好的學

機器學習之路 tensorflow 自定義 損失函數

cond pre port var IV 學習 col float ria git: https://github.com/linyi0604/MachineLearning/tree/master/07_tensorflow/ 1 import tensor

重回機器學習-《python機器學習實踐》讀書筆記

一.三個率         機器學習模型訓練好之後,會在樣本外進行測試,然後我們可以得到三個“率”: 準確率 召回率 精確率         其實這些也沒有什麼大不了的,大家如果學習

分散式學習最佳實踐從分散式系統的特徵開始(附思維導圖)

什麼是分散式系統 回到頂部   分散式系統是由一組通過網路進行通訊、為了完成共同的任務而協調工作的計算機節點組成的系統。分散式系統的出現是為了用廉價的、普通的機器完成單個計算機無法完成的計算、儲存任務。其目的是利用更多的機器,處理更多的資料。   首先需要明確的是,只

Win10+RTX2080深度學習環境搭建tensorflow、mxnet、pytorch、caffe

目錄 準備工作 設定conda國內映象源 conda 深度學習環境 tensorflow、mxnet、pytorch安裝 tensorflow mxnet pytorch Caffe安裝 配置檔案修改 編譯時常見錯誤

Java課程學習十一圖片匹配遊戲

圖片匹配遊戲 引用轉載請註明出處,Thanks! 通過為標籤空間新增圖形以及滑鼠事件,完成圖片配對的遊戲。[1] JFrame 簡介: Swing的三個基本構造塊:標籤、按鈕和文字欄位;但是需要個地方安放它們,並希望使用者知道如何處理它們。JFrame 類