主頁 >  其他 > TensorFlow 2 快速教程,初學者入門必備

TensorFlow 2 快速教程,初學者入門必備

2020-09-17 12:31:28 其他

TensorFlow 2 簡介

TensorFlow 是由谷歌在 2015 年 11 月發布的深度學習開源工具,我們可以用它來快速構建深度神經網路,并訓練深度學習模型,運用 TensorFlow 及其他開源框架的主要目的,就是為我們提供一個更利于搭建深度學習網路的模塊工具箱,使開發時能夠簡化代碼,最終呈現出的模型更加簡潔易懂,

2019 年,TensorFlow 推出了 2.0 版本,也意味著 TensorFlow 從 1.x 正式過度到 2.x 時代,根據 TensorFlow 官方 介紹內容 顯示,2.0 版本將專注于簡潔性和易用性的改善,主要升級方向包括:

  • 使用 Keras 和 Eager Execution 輕松構建模型,
  • 在任意平臺上實作穩健的生產環境模型部署,
  • 為研究提供強大的實驗工具,
  • 通過清理廢棄的 API, 和減少重復來簡化 API,

當然,如果你對 TensorFlow 1.x 本來就不熟悉,可能無法看明白這些升級的內容,不用擔心,本次課程將直接對 TensorFlow 2 進行學習,我們不再回首過去,直接展望未來,

安裝 TensorFlow 2

pip install -U tensorflow

接下來,我們將從 TensorFlow 基礎概念語法入手,一步一步學習 TensorFlow 的使用,

張量

首先,你應該知道什么是向量和矩陣,我們把 1 維的陣列稱之為向量, 2 維的陣列稱之為矩陣,那么,現在告訴你張量其實代表著更大的范圍,你也可以把其看作是N 維陣列,

所以,如果現在重新描述向量和矩陣,就可以是:一階張量為向量,二階張量為矩陣,當然,零階張量也就是標量,而更重要的是 N 階張量,也就是 N 維陣列,

所以,張量并不是什么晦澀難懂的概念,如果不嚴謹的講,張量就是 NN 維陣列,前面提到的向量、矩陣,也是張量,

后面將學習到的大多數深度學習框架都會使用張量的概念,這樣做的好處是統一對資料的定義,NumPy 中,資料都使用 Ndarray 多維陣列進行定義,TensorFlow 中,資料都會用張量進行表述,

下面就來學習 TensorFlow 中對張量的定義,在 TensorFlow 中,每一個 Tensor 都具備兩個基礎屬性:資料型別(默認:float32)和形狀,

其中,資料型別大致如下表所示:

另外,TensorFlow 通過三種符號約定來描述張量維度:階,形狀和維數,三者之間的關系如下:

值得注意的是,上表中的示例都是形容張量的形狀,例如 [3, 4] 指的張量的形狀為 [3, 4],而不是張量 [3, 4],

根據不同的用途,TensorFlow 中主要有 2 種張量型別,分別是:

  1. tf.Variable :變數 Tensor,需要指定初始值,常用于定義可變引數,例如神經網路的權重,
  2. tf.constant :常量 Tensor,需要指定初始值,定義不變化的張量,

我們可以通過傳入串列或 NumPy 陣列來新建變數和常量型別的張量:

代碼示例:

import tensorflow as tf

tf.__version__

輸出

'2.0.0'
v = tf.Variable([[1, 2], [3, 4]])  # 形狀為 (2, 2) 的二維變數
v

輸出

<tf.Variable 'Variable:0' shape=(2, 2) dtype=int32, numpy=
array([[1, 2],
       [3, 4]], dtype=int32)>
c = tf.constant([[1, 2], [3, 4]])  # 形狀為 (2, 2) 的二維常量
c

輸出

<tf.Tensor: id=9, shape=(2, 2), dtype=int32, numpy=
array([[1, 2],
       [3, 4]], dtype=int32)>

仔細觀察,你會發現輸出包含了張量的 3 部分屬性,分別是形狀 shape,資料型別 dtype,以及對應的 NumPy 陣列,

你還可以直接通過 .numpy() 輸出張量的 NumPy 陣列,

c.numpy()

輸出

array([[1, 2],
       [3, 4]], dtype=int32)

上面我們已經介紹了常量張量,這里再列舉幾個經常會用到的新建特殊常量張量的方法:

  • tf.zeros:新建指定形狀且全為 0 的常量 Tensor
  • tf.zeros_like:參考某種形狀,新建全為 0 的常量 Tensor
  • tf.ones:新建指定形狀且全為 1 的常量 Tensor
  • tf.ones_like:參考某種形狀,新建全為 1 的常量 Tensor
  • tf.fill:新建一個指定形狀且全為某個標量值的常量 Tensor
c = tf.zeros([3, 3])  # 3x3 全為 0 的常量 Tensor
c

輸出

<tf.Tensor: id=12, shape=(3, 3), dtype=float32, numpy=
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]], dtype=float32)>
tf.ones_like(c)  # 與 c 形狀一致全為 1 的常量 Tensor

輸出

<tf.Tensor: id=15, shape=(3, 3), dtype=float32, numpy=
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]], dtype=float32)>
tf.fill([2, 3], 6)  # 2x3 全為 6 的常量 Tensor

輸出

<tf.Tensor: id=18, shape=(2, 3), dtype=int32, numpy=
array([[6, 6, 6],
       [6, 6, 6]], dtype=int32)>

除此之外,我們還可以創建一些序列,例如:

  • tf.linspace:創建一個等間隔序列,
  • tf.range:創建一個數字序列,
tf.linspace(1.0, 10.0, 5, name="linspace")

輸出

<tf.Tensor: id=22, shape=(5,), dtype=float32, numpy=array([ 1\.  ,  3.25,  5.5 ,  7.75, 10\.  ], dtype=float32)>
tf.range(start=1, limit=10, delta=2)

輸出

<tf.Tensor: id=26, shape=(5,), dtype=int32, numpy=array([1, 3, 5, 7, 9], dtype=int32)>

實際上,如果你熟悉 NumPy 的話,你會發現這與 NumPy 中創建各式各樣的多維陣列方法大同小異,資料型別是一切的基礎,了解完張量我們就可以繼續學習張量的運算了,

Eager Execution

TensorFlow 2 帶來的最大改變之一是將 1.x 的 Graph Execution(圖與會話機制)更改為 Eager Execution(動態圖機制),在 1.x 版本中,低級別 TensorFlow API 首先需要定義資料流圖,然后再創建 TensorFlow 會話,這一點在 2.0 中被完全舍棄,TensorFlow 2 中的 Eager Execution 是一種命令式編程環境,可立即評估操作,無需構建圖,

所以說,TensorFlow 的張量運算程序可以像 NumPy 一樣直觀且自然了,接下來,我們以最簡單的加法運算為例:

c + c  # 加法計算

輸出

<tf.Tensor: id=27, shape=(3, 3), dtype=float32, numpy=
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]], dtype=float32)>

如果你接觸過 1.x 版本的 TensorFlow,你要知道一個加法運算程序十分復雜,我們需要初始化全域變數 → 建立會話 → 執行計算,最終才能列印出張量的運算結果,

init_op = tf.global_variables_initializer()  # 初始化全域變數
with tf.Session() as sess:  # 啟動會話
    sess.run(init_op)
    print(sess.run(c + c))  # 執行計算

Eager Execution 帶來的好處顯而易見,其進一步降低了 TensorFlow 的入門門檻,之前的 Graph Execution 模式,實際上讓很多人在入門時都很郁悶,因為完全不符合正常思維習慣,

TensorFlow 中提供的數學計算,包括線性代數計算方面的方法也是應有盡有,十分豐富,下面,我們再列舉一個示例,

a = tf.constant([1., 2., 3., 4., 5., 6.], shape=[2, 3])
b = tf.constant([7., 8., 9., 10., 11., 12.], shape=[3, 2])

c = tf.linalg.matmul(a, b)  # 矩陣乘法
c

輸出

<tf.Tensor: id=34, shape=(2, 2), dtype=float32, numpy=
array([[ 58.,  64.],
       [139., 154.]], dtype=float32)>
tf.linalg.matrix_transpose(c)  # 轉置矩陣

輸出

<tf.Tensor: id=36, shape=(2, 2), dtype=float32, numpy=
array([[ 58., 139.],
       [ 64., 154.]], dtype=float32)>

你應該能夠感覺到,這些常用 API 都能在 NumPy 中找到對應的方法,這也就是課程需要你預先熟悉 NumPy 的原因,由于函式實在太多太多,一般來講,除了自己經常使用到的,都會在需要某種運算的時候,查閱官方檔案,

所以說,你可以把 TensorFlow 理解成為 TensorFlow 式的 NumPy + 為搭建神經網路而生的 API,

自動微分

在數學中,微分是對函式的區域變化率的一種線性描述,雖然微分和導數是兩個不同的概念,但是,對一元函式來說,可微與可導是完全等價的,如果你熟悉神經網路的搭建程序,應該明白梯度的重要性,而對于復雜函式的微分程序是及其麻煩的,為了提高應用效率,大部分深度學習框架都有自動微分機制,

TensorFlow 中,你可以使用 tf.GradientTape 跟蹤全部運算程序,以便在必要的時候計算梯度,

w = tf.Variable([1.0])  # 新建張量

with tf.GradientTape() as tape:  # 追蹤梯度
    loss = w * w

grad = tape.gradient(loss, w)  # 計算梯度
grad

輸出

<tf.Tensor: id=52, shape=(1,), dtype=float32, numpy=array([2.], dtype=float32)>

上面,我們演示了一個自動微分程序,它的數學求導程序如下:

image

所以,當 w 等于 1 時,計算結果為 2,

tf.GradientTape 會像磁帶一樣記錄下計算圖中的梯度資訊,然后使用 .gradient 即可回溯計算出任意梯度,這對于使用 TensorFlow 低階 API 構建神經網路時更新引數非常重要,

常用模塊

上面,我們已經學習了 TensorFlow 核心知識,接下來將對 TensorFlow API 中的常用模塊進行簡單的功能介紹,對于框架的使用,實際上就是靈活運用各種封裝好的類和函式,由于 TensorFlow API 數量太多,迭代太快,所以大家要養成隨時 查閱官方檔案 的習慣,

  • tf.:包含了張量定義,變換等常用函式和類,
  • tf.data:輸入資料處理模塊,提供了像 tf.data.Dataset 等類用于封裝輸入資料,指定批量大小等,
  • tf.image:影像處理模塊,提供了像影像裁剪,變換,編碼,解碼等類,
  • tf.keras:原 Keras 框架高階 API,包含原 tf.layers 中高階神經網路層,
  • tf.linalg:線性代數模塊,提供了大量線性代數計算方法和類,
  • tf.losses:損失函式模塊,用于方便神經網路定義損失函式,
  • tf.math:數學計算模塊,提供了大量數學計算函式,
  • tf.saved_model:模型保存模塊,可用于模型的保存和恢復,
  • tf.train:提供用于訓練的組件,例如優化器,學習率衰減策略等,
  • tf.nn:提供用于構建神經網路的底層函式,以幫助實作深度神經網路各類功能層,
  • tf.estimator:高階 API,提供了預創建的 Estimator 或自定義組件,

在構建深度神經網路時,TensorFlow 可以說提供了你一切想要的組件,從不同形狀的張量、激活函式、神經網路層,到優化器、資料集等,一應俱全,由于 TensorFlow 包含的介面太多,每個都拿出來練習變得不切實際,關于TensorFlow 2.0 的基礎內容就到這里!

想要了解新特性的詳細內容,請學習課程:

《TensorFlow 2.0 新特性快速入門?》

想要進行實戰專案,請學習課程:
《TensorFlow 2 深度學習入門與實踐》?

知乎專欄同步:https://zhuanlan.zhihu.com/p/88829655

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/65628.html

標籤:其他

上一篇:AB實驗的高端玩法系列2 - 更敏感的AB實驗, CUPED!

下一篇:LeetCode初級演算法--其他01:位1的個數

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more