深度學習-TensorFlow2.0筆記(一)

来源:https://www.cnblogs.com/kensporger/archive/2019/11/26/11920843.html
-Advertisement-
Play Games

一、Tensor 1.1 什麼是Tensor?Tensor的數據類型 Tensor是張量的意思,在TensorFlow中張量可以是標量(scalar)、向量(vector)、矩陣(matrix)、高維度張量(rank>2),像Numpy里的數組就不屬於Tensor。TensorFlow里的常用的數據 ...


一、Tensor

 1.1 什麼是Tensor?Tensor的數據類型

    Tensor是張量的意思,在TensorFlow中張量可以是標量(scalar)、向量(vector)、矩陣(matrix)、高維度張量(rank>2),像Numpy里的數組就不屬於Tensor。TensorFlow里的常用的數據類型有tf.int32、tf.float32、tf.double、tf.bool、tf.Variable。下麵展示了用tf.constant創建的一些Tensor:

    

    需要特別註意代碼IN[18]-IN[21]行,由於TensorFlow有自動求導功能,而被求導參數類型必須為Variable類型,這樣才可以被記錄下梯度信息。但是Variable類型在於int、float運算過程中,假如被更新了,其類型會自動轉為int、float類型,導致求導出錯。第二個需要註意的是代碼第34-36行,Tensor不同類型數據間不能混合運算(除了Variable),否則會出錯,而在深度學習中,運算通常採用浮點形式,這種錯誤較少出現。為瞭解決Variable更新自動被轉成其他類型,可以採用原地更新,即數據類型不變,如下例所示,使用assign方法可以實現任意賦值而不改變類型:

        

 

 1.2  Tensor的shape

    Tensor最常用的屬性就是shape,即維度信息,以下代碼展示了標量、向量、矩陣、高維度張量的shape信息。對於標量,其維度為0,則Python顯示shape為(),對於矩陣,shape第一個元素表示行數,第二個表示列數。:

    

    

 1.3  Tensor的驗證

    可以用tf.is_tensor()方法判斷是否屬於Tensor類型,也可以用dtype屬性進行判斷,這裡拿Numpy做對比:

     

 

 1.4  Tensor轉換

    在實際編寫中,由於需要導入數據集,所以經常會用到數據轉換方法,將數據集轉為Tensor或Tensor轉為其他形式,如Numpy:

    

     tf.cast可以用來轉換Tensor的數據類型。

 

 1.5  Tensor創建

    前面使用過constant以及Variable創建過Tensorm下麵介紹更實用的創建方法。

    首先是間接創建,即通過Numpy,List創建然後轉化為Tensor:

    

     但是需要註意不能轉換的情況,一種是數據類型不統一,第二種是結構不統一,如下:

    

    另外就是直接通過tf的方法直接創建一些矩陣、特殊分佈等數據形式:

    

    在構建網路權重的時候,常會用到正態分佈或者均勻分佈來初始化,其中截斷型的正態分佈應用更多。

            

 

    

二、索引與切片

 2.1  多維度索引

    Tensor索引常採用列表形式,而不是像a[0][1][2]的形式。比如:

    

     可以看到多次索引後,結果變為了標量。 這就如同註冊賬戶時選擇地址一樣。

    索引可以是負值,正索引0表示第一個元素,而負索引-1表示最後一個元素。

 

 2.2  使用索引列表進行切片

    對於索引列表的每個維度索引,都可以用start:end:step獲取切片,其切片範圍為[start,end),註意end是取不到的,step指定了步長,類似於隔幾行採樣一次。索引可以有省略形式,start省略預設為最開始的地方,end省略預設為結束的地方,step省略表示1。如:表示範圍為全部,step=1。::2表示範圍為全部,但step=2。2::表示範圍≥2,step=1。其他情況類似。

·    

    採用負索引進行切片,範圍仍舊是start取得到,end取不到,切片方向仍然是從左向右,因此步長需為正。正索引與負索引可以混合使用:

    

     另外,通過切片可以實現逆序功能,即每個維度中的數據都倒過來排列。

    

    當維度較多,不想打冒號,可以用...。前提是切片的範圍是整個,並且,省略號不能同時出現在兩邊,這樣是無法判斷結構的。

    

 

 2.3  gather抽樣切片

     索引列表進行切片還是有很多限制,只能按一定步長等間距取樣,取樣是有序的。而gather可以一次對某個維度(給定axis)進行任意位置任意數量任意順序的取樣(給定indices),這裡的indices不是索引坐標,而是該維度下數據位置索引的有序集合,不能用冒號形式。

    

 

 2.4  gather_nd抽樣與自定義結構

    gather_nd參數中給出一個結構,輸出結果會將結構中的索引用數據替代,例如下麵In[104],用a[0]替代了結構[0],所以結果是一個向量;又比如In[107],用a[0]替代[0],用a[1]替代[1]因為結構包裹了一層方括弧,因此,結果是一個矩陣。註意這裡的[0,1]可以理解為索引列表,但是不支持冒號。所以有個問題就是gather與gather_nd在截取比較複雜的數據時,會比較麻煩。

    

 

 

  

三、維度變換

 3.1  reshape分解與合併維度

    reshape改變維度,並不會影響數據存儲的順序與內容,只是會丟失維度的信息,改變視圖結構,進行了數據重新的組合。在改變維度的過程中,應該小心,保證更改後總大小不變,例如:

    

 

 3.2  transpose轉置與維度交換

    transpose可以對多維Tensor進行轉置,註意它並不局限於矩陣,其轉置相當於將shape倒過來排列,例如[1,2,3]轉置為[3,2,1]。此外,它還可以進行任意的維度交換,實際上轉置也可以看做維度的交換,例如[1,2,3]現在可以將第二維和第三維交換,結果是[1,3,2]。詳細情況如下,transpose指定perm時,預設功能為倒置。

    

 

 3.3  expand_dims擴維與squeeze降維

    在矩陣計算中經常碰到維度不一致的情況,例如一個3*3的矩陣和一個長度為3的向量做加法,需要將向量在橫向上複製成3*3的矩陣。這裡就可以用expand_dims+tile實現。expand_dims需要制定插入的位置,即制定axis,如果設定的axis非負,則會在axis前面擴展,否則在axis後擴展。例如對shape為(a,b)的Tensor進行擴展,指定axis=0,那麼就在維度a前擴展,擴展後shape為(1,a,b);如果指定axis=-1,那麼就是在維度b的後面進行擴展,擴展後shape為(a,b,1)。到此為止,expand_dims做的事類似於reshape,實際上也可以用reshape來做擴展,效果是一樣的。例如:

    

     tile的作用在於將對應的維度值以倍數擴展,數據以複製形式進行填充。上例中,1->1*3;2->2*4;3->3*1。

    squeeze則用於降維,可以刪去值等於1的維度,例如[1,2,3,1]降維後為[2,3]。squeeze用法如下圖:

    

 

 3.4  broadcast廣播

    前面展示了通過expand+tile的方法進行擴展使不同維度的Tensor變為相同維度進行運算,實際中,像加減乘除一些運算支持隱式Broadcast自動擴展,Broadcast性能比expand來得好,占用記憶體小。正是有這種自動擴展,在Tensorflow里一些不同維度的Tensor可以直接進行運算,如下圖:

    

 

    可以看到,一個矩陣與向量作四則運算並未出錯。原因在於運算前,向量自動擴展為(2,3)。但不是任何情況都不會出錯,擴展的過程為,遵循最後一維對齊原則,缺失的維度自動擴展,且值為1,對值為1的維度進行擴展,值不為1的維度不能擴展。對比下列情況:

    

    [3,1]可以擴展,根據右對齊原則,[3,1]缺少對應2的維度,自動擴展為(1,3,1)。左1對應於2,可以擴成2。3對應於3,不用擴展。右3對應於4,擴為4。[3,2]根據右對齊原則,2對應於4,兩者不相等且不為1,所以不能擴展。

    有些時候可能出現不支持隱式擴展,這時候可以顯式擴展:

    

 

 

四、Tensor運算

 4.1  加減乘除餘

    加減乘除餘都是對應位置元素作運算,符號為:+、-、*、/、//、%,示例如下:

    

    

 4.2  冪與平方根

    Tensor的冪和平方根就是各元素的冪與平方根,符號為:**(pow)、sqrt。示例如下:

    

 

 

 4.3  指數與對數

    Tensor的指數和對數就是各元素的指數與對數。TensorFlow里只有以e為底的對數,要實現其他對數底,可以利用數學公式轉換底到e:

    

    另外,需要註意的是指數和對數的參數必須為浮點數,用整數會報錯:

    

 

     

 4.4  叉乘

    符號為@:

    


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 現有列表a, a中元素是如[x,y]格式的數組,代表一段數字區間, 如[1,3]表示從1到3之間的任何數字 判斷給定的新數字區間new_element(例如: [10, 25])能不能添加到列表a中,返回True or False 要求任何被添加進入列表a的新數字區間,必須滿足以下條件: 新插入的數 ...
  • 1、下載 httpd-2.4.41-win64-VC15.zip、php5.6、php7.3 2、配置httpd,在 httpd.conf L180 添加如下代碼: 3、分別在 php5.6、php7.3中配置 php.ini 4、以管理員身份打開cmd 5、這樣就可以在任務管理器中隨意切換php5 ...
  • 之前有人詢問 self 關鍵字的用法,答案是比較明顯的:靜態成員函數內不能用 this 調用非成員函數,但可以用 self 調用靜態成員函數/變數/常量;其他成員函數可以用 self 調用靜態成員函數以及非靜態成員函數。隨著討論的深入,發現 self 並沒有那麼簡單。鑒於此,本文先對幾個關鍵字做對比 ...
  • 1.什麼是redis? Redis 是一個基於記憶體的高性能key-value資料庫。 2.Reids的特點 Redis本質上是一個Key-Value類型的記憶體資料庫,很像memcached,整個資料庫統統載入在記憶體當中進行操作,定期通過非同步操作把資料庫數據flush到硬碟上進行保存。因為是純記憶體操作 ...
  • [TOC] 模板語法 兩種書寫格式: 變數相關 {{ }} 邏輯相關 {% %} 模板傳值 給html頁面傳值的兩種方式 第一種方式 弊端就是:當要傳的變數名很多的時候,就很麻煩 第二種 locals() locals() 會將當前所在的名稱空間中所有的名字全部傳遞給html頁面 傳值 基本數據類型 ...
  • JavaWeb——下載並安裝Tomcat伺服器 摘要:本文主要學習如何下載並安裝Tomcat伺服器。 背景知識 什麼是JavaWeb JavaWeb,是用Java技術來解決相關Web互聯網領域的技術的總稱。Web包括:Web伺服器和Web客戶端兩部分。 Java在最早Web客戶端的應用有Java A ...
  • 現在是北京時間2019年11月28日,大學畢業已經工作四個多月。說來也是奇怪,大學裡面明明主修機械電子工程,幾乎是純機械方向,畢業之後的工作卻與主修的課程毫無關係。因為對機械這一行業毫無興趣,大學裡面花了點時間學了學C,做過一些項目。畢業設計又拿python寫了個爬蟲並且為它做了一個界面(當時整個機 ...
  • 場景 效果 cutecharts的Github: https://github.com/chenjiandongx/cutecharts 註: 博客: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲取編程相關電子書、教程推送與免費下載 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...