1. 程式人生 > >深度學習筆記——TensorFlow學習筆記(一)入門

深度學習筆記——TensorFlow學習筆記(一)入門

之前使用的深度學習框架一直是Keras,Keras的高階封裝特性讓人們十分容易理解並上手。不過有些時候,由於keras過於封裝,反而使得有些時候不能靈活運用。這時候更底層一些的TensorFlow就體現出優勢來了。另外,大家知道,keras的底層後端有Theano和TensorFlow兩種,如果想要自己實現一個自定義層,就需要呼叫後端介面實現了。

基於此,最近開始學習一些TensorFlow的知識,因此就在此記錄一下學習過程和使用心得吧。

TensorFlow的安裝教程網上可以搜到一大堆,我在此就不在贅述了。在安裝好TensorFlow和相應的依賴包、加速包CUDA等之後,就可以愉快地開始TensorFlow學習與使用啦~~~~

我使用的TensorFlow版本是1.0.1版本,因此一些使用舊版本0.x的需要注意一些函式和介面的變化。

接下來就開始TensorFlow的學習旅程吧,本文只是前期的一些入門知識總結,接下來會陸續寫一些關於TensorFlow的例項。

1.TensorFlow計算模型——計算圖

計算圖是TensorFlow中最基本的一個概念,TensorFlow中的所有計算都會被轉化為計算圖上的節點。

TensorFlow程式一般分為兩個階段。在第一個階段需要定義計算圖中所有的計算,第二個階段為執行計算,得到計算結果。

在TensorFlow程式中,系統會自動維護一個預設的計算圖,通過tf.get_default_graph函式可以獲取當前預設的計算圖。除了使用預設的計算圖外,TensorFlow支援通過tf.Graph函式來生成新的計算圖,不同計算圖上的張量和執行都不會共享

下面是一個生成計算圖並定義變數的程式碼:

import tensorflow as tf

g = tf.Graph()

with g.as_default():

#在計算圖中定義變數“v”,並設定初始值為0

v = tf.get_variable("v", initializer = tf.zeros_initializer(shape=[1]))

TensorFlow中的計算圖不僅可以用來隔離張量和計算,它還提供了管理張量和計算的機制。計算圖可以通過tf.Graph.device函式來指定執行計算的裝置,這為TensorFlow使用GPU提供了機制。

g = tf.Graph()

#指定計算執行的裝置

with g.device('/gpu:0'):

result = a + b

2.TensorFlow資料模型——張量

張量(tensor)是TensorFlow管理資料的形式,在TensorFlow所有程式中,所有的資料都是通過張量的形式來表示。從功能的角度上來看,張量可以被簡單理解為多維陣列。其中零階張量表示標量,也就是一個數;一階張量表示一個向量,也就是一個一維陣列;n階張量可以理解為一個n維陣列。但張量在TensorFlow中的實現並不是直接採用陣列的形式,它只是對TensorFlow中運算結果的引用。在張量中並沒有真正儲存數字,它儲存的是如何得到這些數字的計算過程。

張量主要有三個屬性:名字(name)、維度(shape)和型別(type)。如:Tensor("add:0", shape=(2,), dtype=float32)

張量的名字不僅是一個張量的唯一識別符號,同樣也給出了這個張量是如何計算出來的。張量的命名通過“node:src_output”的形式給出,其中node為結點的名稱,src_output表示當前張量來自結點的第幾個輸出。如上面的"add:0"表明這個張量是計算節點"add"輸出的第一個結果。

張量的維度描述了張量的維度資訊,如上面的“shape=(2,)”說明這個張量是一個一維陣列,陣列長度為2。TensorFlow程式中維度的對應是一個需要十分注意的地方。

張量的型別表明了資料的型別,TensorFlow會對參與運算的所有張量進行型別檢查,當發現型別不匹配時會報錯。主要有以下14種類型:tf.int8,tf.int16,tf.int32,tf.int64,tf.uint8,tf.float32,tf.float64,tf.bool,tf.complex64,tf.complex128.

張量的使用:

第一類用途是對中間運算結果的引用,如:

#使用張量記錄中間結果

a = tf.constant([1.0, 2.0], name = "a")

b = tf.constant([2.0, 3.0], name = "b")

c = a + b

可以使用c.get_shape函式來獲取結果張量的維度資訊

張量的第二類使用情況是當計算圖構造完成之後,張量可以用來獲得計算結果,也就是得到真實的數字。可以使用tf.Session().run(c)語句得到計算結果。

3.TensorFlow執行模型——會話

TensorFlow中使用會話(session)來執行定義好的運算。會話擁有並管理TensorFlow程式執行時的所有資源。

TensorFlow中使用會話的模式有兩種,第一種模式需要明確呼叫會話生成函式和關閉會話函式,程式碼流程如下:

#建立一個會話

sess = tf.Session()

#使用會話進行運算

sess.run(...)

#關閉會話

sess.close()

上面這種模式在所有計算完成之後需要明確呼叫Session.close()函式來關閉會話並釋放資源。如果程式因為異常而退出,則會導致會話未關閉而資源洩露。因此,為了解決異常退出時資源釋放的問題,可以通過Python的上下文管理器來使用會話,這就是第二種模式,程式碼流程如下:

#建立一個會話

with tf.Session() as sess:

#使用這個會話進行運算,下面兩個命令有相同的功能

sess.run(rusult)

result.eval()

通過上面的學習,在瞭解了TensorFlow的一些基本概念之後,接下來就用一個例項來親身體驗一下吧。

用TensorFlow實現神經網路,主要分為以下3個步驟:

1)定義神經網路的結構和前向傳播的輸出結果

2)定義損失函式以及選擇方向傳播優化演算法

3)生成會話並在訓練資料上反覆執行反向傳播優化演算法

具體程式碼如下:

import tensorflow as tf

from numpy.random import RandomState

#定義訓練資料batch的大小
batch_size = 8

#定義神經網路的引數
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
bias1 = tf.Variable(tf.random_normal([3], stddev=1, seed=1))
bias2 = tf.Variable(tf.random_normal([1], stddev=1, seed=1))

在shape的一個維度上使用None可以方便使用不大的batch大小
x = tf.placeholder(tf.float32, shape=(None, 2), name='x-input')
y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input')

#定義神經網路前向傳播的過程
# a = tf.matmul(x, w1)
# y = tf.matmul(a, w2)

a = tf.nn.relu(tf.matmul(x, w1) + bias1)
y = tf.nn.relu(tf.matmul(a, w2) + bias2)

#定義損失函式和反向傳播演算法
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))#交叉熵損失函式
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)#梯度下降優化演算法

#produce the data,通過隨機數生成一個模擬資料集
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)
Y = [[int(x1 + x2 < 1)] for (x1, x2) in X]

#creare a session,建立一個會話來執行TensorFlow程式
with tf.Session() as sess:
    #init all variable,初始化變數
    init_op = tf.initialize_all_variables()
    sess.run(init_op)
    #訓練之前檢視w1和w2的值
    print sess.run(w1)
    print sess.run(w2)
    #設定訓練的輪數
    STEPS = 5000
    for i in range(STEPS):
        #get batch_size samples data to train,每次選取batch_size個樣本進行訓練
        start = (i * batch_size) % dataset_size
        end = min(start + batch_size, dataset_size)

        #通過選取的樣本訓練神經網路並更新引數
        sess.run(train_step, feed_dict = {x : X[start : end], y_ : Y[start : end]})
        if i % 1000 == 0:#每隔一段時間計算在所有資料上的交叉熵並輸出
            total_cross_entropy = sess.run(cross_entropy, feed_dict={x : X, y_ : Y})
            print ("After %d training steps, cross_entropy on all data is %g" %(i, total_cross_entropy))
    #在訓練結束之後,輸出神經網路的引數
    print sess.run(w1)
    print sess.run(w2)


相關推薦

深度學習tensorflow的小日子

本系列專門用來記錄我的深度學習歷程,其中程式碼大部分均出自於李金洪老師的《深度學習之TensorFlow》,希望所有機器學習的道友都能有所知、有所得。 import tensorflow as tf import numpy as np import matpl

深度學習筆記——TensorFlow學習筆記入門

之前使用的深度學習框架一直是Keras,Keras的高階封裝特性讓人們十分容易理解並上手。不過有些時候,由於keras過於封裝,反而使得有些時候不能靈活運用。這時候更底層一些的TensorFlow就體現出優勢來了。另外,大家知道,keras的底層後端有Theano和Tens

Deep Learning深度學習學習筆記整理系列之

Deep Learning(深度學習)學習筆記整理系列 作者:Zouxy version 1.0  2013-04-08 宣告: 1)該Deep Learning的學習系列是整理自網上很大牛和機

JavaSE 學習筆記之Java概述

environ 電子 6.0 run javase 有一點 架構 spa form 一、Java的三種技術架構: JAVAEE:Java Platform Enterprise Edition,開發企業環境下的應用程序,主要針對web程序開發; JAVASE:Java P

設計模式學習筆記 C#代碼

內容 編程 繼承 color 模式 c# 派生類 ive spa 《深入淺出設計模式》學習筆記第一章 原始需求和設計 事情是這樣開始的,公司需要做一套程序,鴨子,設計如下: 一個鴨子父類,多個派生類,三個可override的方法。 第一次需求變更 我們要會飛的鴨子!!!!

FPGA軟硬協同設計學習筆記及基礎知識

擴展性 產生 新的 pll 多個 分配 每次 調用 span 一、FPGA軟件硬件協同定義: 軟件:一般以軟件語言來描述,類似ARM處理器的嵌入式設計。硬件定義如FPGA,裏面資源有限但可重配置性有許多優點,新的有動態可充配置技術。

多線程編程學習筆記——線程同步

als 執行 homepage auto using 發的 進行 read 函數 接上文 多線程編程學習筆記-基礎(一) 接上文 多線程編程學習筆記-基礎(二) 接上文 多線程編程學習筆記-基礎(三) 就如上一篇文章(多線程編程學習筆記-基礎(三))

matlab學習筆記之常用命令

plot 我們 all 查看 學習 ear tla clear 但是 一.清除命令。   1.clear all;%清除所有變量,通常在matlab的工作區;另外斷點也會被清除掉   2.close all;%關閉所有窗口(除了編輯器窗口、命令窗口、幫助窗口)   3.cl

python學習筆記 day44 mysql練習題

習題來自: http://www.cnblogs.com/wangfengming/articles/7944029.html   1. 習題內容: 1.建立留言資料庫: liuyandb; 2.在liuyandb資料庫中建立留言表liuyan,結構如下: 3.在留言表最後新

J2SE學習筆記1.11Java介面

一、基本概念 介面(Interface),在JAVA程式語言中是一個抽象型別,是抽象方法的集合。介面通常以interface來宣告。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。 如果一個類只由抽象方法和全域性常量組成,那麼這種情況下不會將其定義為一個抽象類。只會定

linux學習筆記之shell程式設計

shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則

linux學習筆記之流程控制if分支語句

流程控制 if語句 單分支if語句 程式 fi``` ```if [ 判斷 ] then 程式 fi``` 例項程式碼指令碼: #!/bin/bash

從零開始學習音視訊程式設計技術 視訊格式講解學習筆記

/*  該型別部落格為學習時載錄筆記,加上自己對一些不理解部分自己的理解。會涉及其他博主的博文的摘錄,會標註出處  */ ==========================================================================

linux學習筆記之shell程式設計正則表示式與字元處理

shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則表示式常用的字元(注意區別於萬用字元裡面的符號)#### -*

Django學習筆記之環境搭建

           Django是一個高階的Python Web開發框架,它鼓勵快速開發,和實用的設計。它採用了MTV的設計模式,並且它由經驗豐富的開發人員來構建, 可以解決Web開發的諸多問題,因此也被稱為全棧Web開發框架。它是開源的,直接

【C++學習筆記】運算子過載

在C++中我們定義了自己專屬的類,但是隨著類的增加,以及裡面成員複雜度的提高,以前我們常用的運算子就不能很好的處理新出現的資料型別了,這時,就有一個很“異想天開”的想法了——我們自己定義運算子! 運算子的過載 運算子過載是使同一個運算子作用於不同型別的資料時具有不同的行為。例如我們宣

【C++學習筆記】虛擬函式

12.3 昨天居然斷更了,唉,寫部落格真是很需要毅力呀,更新上今天的學習筆記。 上次我們講到多型性的定義以及簡述了實現方式以及靜態編譯和動態編譯的概念。這次,我們來具體講一講虛擬函式。 什麼是虛擬函式 在某基類中宣告為 virtual 並在一個或多個派生類中被重新定義的成

Vue-router學習筆記——遇到的坑history模式重新整理/設定巢狀路由顯示404/cannot findwebpack配置

前端路由有兩種,一種是hash模式,一種是history模式。 這兩種模式的url路徑都不需要真實存在,只需要為前端跳轉做一個顯示。 hash模式的url路徑會帶有#,看起來不太舒服且不好做SEO,但是因為瀏覽器向伺服器請求時會自動忽略#後面的值,所以在瀏覽器中重新整理還是

uCOS-II學習筆記:實時作業系統

1.前後臺系統:前後臺系統的架構用一句話來形容的話,就是一個大的迴圈,加上中斷,就形成了一個整的體系。 假設來了中斷需要處理模組3,如果模組3的處理是最緊迫的,但是當前cpu 只執行到模組1, 這樣的話,必須還要承受模組2的執行時間延遲,才能輪到模組3的處理,當模組越多的

Thinkphp學習筆記——新增友情連結

*============在公共模板的左側列表 增加友情連結列表==============↓ D:\phpStudy\WWW\niwo\application\admin\view\common\left.html 複製內容: <li>