Pytorch深度學習實踐筆記12(b站劉二大人)

🎬個人簡介:一個全棧工程師的升級之路!
📋個人專欄:pytorch深度學習
🎀CSDN主頁?發狂的小花
🌄人生秘訣:學習的本質就是極致重復!

《PyTorch深度學習實踐》完結合集_嗶哩嗶哩_bilibili?

目錄

1 全連接

2 矩陣乘法的本質

3 循環神經網絡(RNN)

3.1 引入RNN的前言

3.2 RNN

3.3 RNN cell


1 全連接


FC,也加Linear Layer,Dense Layer。在全連接層中,每個神經元與前一層的每個神經元都有連接,每一個連接都有一個權重,形成一個完全連接的網絡結構。
獲得全局視野,放在神經網絡的最后,用來做分類,完成全部特征的信息共享和特征融合,將隱層特征空間逐步映射到樣本空間,比如ResNet50會輸出1000個特征的得分值,這1000個特征的得分值,遍可以對應到圖像的分類。
由于全連接需要當前的每一個神經元與前一層的每一個神經元相連,這樣需要的權重參數是巨大的。

?




2 矩陣乘法的本質


資源的整合和再創。
假設有金酒、利口酒、檸檬汁、可樂四種原料,可以用來調制雞尾酒。
自由古巴: 0.2 x 金酒+ 0.45 x 利口酒 + 0.1 x 檸檬汁 + 0.25 x 可樂
長島冰茶: 0.6 x 金酒+ 0.3 x 利口酒 + 0.05 x 檸檬汁 + 0.05 x 可樂
龍舌蘭日出:0.3 x 金酒+ 0.1 x 利口酒 + 0.3 x 檸檬汁 + 0.3 x 可樂
可以用矩陣乘法來表示,中間的是權重矩陣。

?


左矩陣是1行4列,代表原料。右矩陣是4行3列,每一列代表對應雞尾酒的原料配比。
按照矩陣乘法的規則,他們的結果應該是一個1行3列的矩陣,分別代表調配出的三種雞尾酒。 由此可以清晰的看出矩陣乘法的對資源的整合和再創。對應在深度學習中,我們得到多張Feature Map后轉到1維后,就是得到了圖像的多種尺度下的各個特征,然后進行全連接時,我們利用權重矩陣與之相乘后相加,就是對各個特征進行了整合和再創,最后按照分類的數量來輸出。

?


3 循環神經網絡(RNN)


3.1 引入RNN的前言

  • 為什么不用全連接處理序列數據?

看這個連接
理解RNN的結構+特點+計算公式_rnn結構-CSDN博客
比如預測天天氣,就需要知道之前幾天的數據,每一天的數據都包含若個特征,需要若干天的數據作為輸入
假設現在取前3天,每一天有3個特征
把x1,x2,x3拼成有9個維度的長向量,然后去訓練最后一天是否有雨

?


用全連接進行預測,如果輸入的序列很長,而且每一個序列維度很高的話,對網絡的訓練有很大挑戰,全連接層需要的權重很多,這點我們上面已經說過。

  • 為什么卷積神經網絡的權重比較少呢?

卷積使用了權重共享,整張圖像的卷積核是共享的,并不是圖像的每一個像素要和下一層的Feature Map建立連接,權重少。

3.2 RNN


用于處理一些具有前后關系的序列問題。
循環神經網絡(Recurrent Neural Network, RNN)是一類以序列數據為輸入,在序列的演進方向進行遞歸且所有節點(循環單元)按鏈式連接的遞歸神經網絡。常見的循環神經網絡包括雙向循環神經網絡(Bidirectional RNN, Bi-RNN)和長短期記憶網絡(Long Short-Term Memory networks,LSTM)。循環神經網絡的真正形式是左邊這種,但是也常表現為右邊這種,一般隱藏層初始狀態為0,當輸入x1后,計算出下一個狀態h1,當輸入x2時,隱藏層狀態輸入變為h1,這時再輸出一個新的狀態h2,依次類推。


RNN專門用來處理帶有序列模式的數據,也使用權重共享減少需要訓練的權重的數量
我們把x1,x2,x3,xn看成是一個序列,不僅考慮x1,x2之間的連接關系,還考慮x1,x2的時間上的先后順序
x2依賴于x1,x3依賴于x2,下一天的天氣狀況部分依賴于前一天的天氣狀況,RNN主要處理這種具有序列連接的
天氣,股市,金融,自然語言處理都是序列數據


3.3 RNN cell


本質上是一個線性層,把一個維度映射到另一個維度。
RNN cell作為線性層是共享的,展開是后面,RNN cell可以依據不同的輸入和輸出循環調用。
運算過程:
h0和x1經過某種運算將他們拼接在一起,即:分別做線性變換,然后求和,生成h1。然后把h1,作為輸出送到下一次RNN cell計算中,這次輸入變成x2,x2和h1合在一起運算,生成h2等。

?

?

?


具體計算過程:
輸入xt先做線性變換,h t-1也是,xt的維度是input_size,h t-1的維度是hidden_size,輸出ht的維度是hidden_size,我們需要先把xt的維度變成hidden_size,所以Wih應該是一個 hidden_size*input_size的矩陣,Wih * xt得到一個 hidden_size*1的矩陣(就是維度為hidden_size的向量),bih是偏置。輸入權重矩陣Whh是一個hidden_size* hidden_size的矩陣。
whhHt-1+bhh和WihXt+bih都是維度為hidden_size的向量,兩個向量相加,就把信息融合起來了,融合之后用tanh做激活,循環神經網絡的激活函數用的是tanh,因為tanh的取值在-1到+1之間,算出結果得到隱藏層輸出ht。
把RNN Cell以循環的方式把序列(x1,x2,…)一個一個送進去,然后依次算出隱藏層(h1,h2…)的過程,每一次算出來的h會作為下一個RNN Cell的輸入,這就叫循環神經網絡 。


RNN 和RNN cell:

【PyTorch學習筆記】21:nn.RNN和nn.RNNCell的使用-CSDN博客?



(1)RNN cell

?


?

?


每次向網絡中輸入batch個樣本,每個時刻處理的是該時刻的batch個樣本。例如,輸入3句話,每句話包含10個單詞,每個單詞用100維向量表示,那么 seq_len = 10,batch = 3,feature_len = 100

?


import torch
batch_size=1
seq_len=3
input_size=4
hidden_size=2Cell=torch.nn.RNNCell(input_size=input_size,hidden_size=hidden_size)#初始化,構建RNNCelldataset=torch.randn(seq_len,batch_size,input_size)#設置dataset的維度
print(dataset)hidden=torch.zeros(batch_size,hidden_size)#隱層的維度:batch_size*hidden_size,先把h0置為0向量for idx,input in enumerate(dataset):print('='*10,idx,'='*10)print('Input size:',input.shape)hidden=Cell(input,hidden)print('Outputs size:',hidden.shape)print(hidden)

?


(2)RNN構造

?

?

?


?

import torch
batch_size=1
seq_len=3
input_size=4
hidden_size=2
num_layers=1
cell=torch.nn.RNN(input_size=input_size,hidden_size=hidden_size,num_layers=num_layers)
#構造RNN時指明輸入維度,隱層維度以及RNN的層數
inputs=torch.randn(seq_len,batch_size,input_size)
hidden=torch.zeros(num_layers,batch_size,hidden_size)
out,hidden=cell(inputs,hidden)
print('Output size:',out.shape)
print('Output:',out)
print('Hidden size:',hidden.shape)
print('Hidden',hidden)

?




4 RNN 訓練hello 轉換到ohlol

?

?



?

?

?


?

#使用RNN
import torchinput_size=4
hidden_size=4
num_layers=1
batch_size=1
seq_len=5
# 準備數據
idx2char=['e','h','l','o'] # 0 1 2 3
x_data=[1,0,2,2,3] # hello
y_data=[3,1,2,3,2] # ohlol# e h l o
one_hot_lookup=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]] #分別對應0,1,2,3項
x_one_hot=[one_hot_lookup[x] for x in x_data] # 組成序列張量
print('x_one_hot:',x_one_hot)# 構造輸入序列和標簽
inputs=torch.Tensor(x_one_hot).view(seq_len,batch_size,input_size)
print(inputs)
labels=torch.LongTensor(y_data)  #labels維度是: (seqLen * batch_size ,1)
print(labels)# design model
class Model(torch.nn.Module):def __init__(self,input_size,hidden_size,batch_size,num_layers=1):super(Model, self).__init__()self.num_layers=num_layersself.batch_size=batch_sizeself.input_size=input_sizeself.hidden_size=hidden_sizeself.rnn=torch.nn.RNN(input_size=self.input_size,hidden_size=self.hidden_size,num_layers=self.num_layers)def forward(self,input):hidden=torch.zeros(self.num_layers,self.batch_size,self.hidden_size)out, _=self.rnn(input,hidden)# 為了能和labels做交叉熵,需要reshape一下:(seqlen*batchsize, hidden_size),即二維向量,變成一個矩陣return out.view(-1,self.hidden_size)net=Model(input_size,hidden_size,batch_size,num_layers)# loss and optimizer
criterion=torch.nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(net.parameters(), lr=0.05)# train cycle
for epoch in range(20):optimizer.zero_grad()#inputs維度是: (seqLen, batch_size, input_size) labels維度是: (seqLen * batch_size * 1)#outputs維度是: (seqLen, batch_size, hidden_size)outputs=net(inputs)loss=criterion(outputs,labels)loss.backward()optimizer.step()_, idx=outputs.max(dim=1)idx=idx.data.numpy()print('Predicted: ',''.join([idx2char[x] for x in idx]),end='')print(',Epoch [%d/20] loss=%.3f' % (epoch+1, loss.item()))
  • Embeding 嵌入層
    one-hot編碼是稀疏的編碼方式,轉換為稠密的
    獨熱編碼向量維度過高;
    獨熱編碼向量稀疏,每個向量是一個為1其余為0;
    獨熱編碼是硬編碼,編碼情況與數據特征無關;
    采用一種低維度的、稠密的、可學習數據的編碼方式:Embedding。


    Embedding把一個高維的稀疏的樣本映射到一個稠密的低維的空間里面,也就是數據的降維。
    ?

理解RNN的結構+特點+計算公式_rnn結構-CSDN博客

?




查詢

?


輸入為2,就表示是第二個字符的索引(索引從0開始),找到第2行,把這個向量輸出,這就叫embedding
?

?


輸入層必須是長整型張量,輸出是(seqlen,4)

?



embedding初始化:

num_bedding: input 獨熱向量的維度
num_bedding() 和 embedding_dim()構成矩陣的寬度和高度

輸入層必須是長整型張量,輸出是(input shape,embedding_shape)

?

#Embedding編碼方式
import torchinput_size = 4
num_class = 4
hidden_size = 8
embedding_size = 10
batch_size = 1
num_layers = 2
seq_len = 5idx2char_1 = ['e', 'h', 'l', 'o']
idx2char_2 = ['h', 'l', 'o']x_data = [[1, 0, 2, 2, 3]]
y_data = [3, 1, 2, 2, 3]# inputs 維度為(batchsize,seqLen)
inputs = torch.LongTensor(x_data)
# labels 維度為(batchsize*seqLen)
labels = torch.LongTensor(y_data)class Model(torch.nn.Module):def __init__(self):super(Model, self).__init__()#告訴input大小和 embedding大小 ,構成input_size * embedding_size 的矩陣self.emb = torch.nn.Embedding(input_size, embedding_size)self.rnn = torch.nn.RNN(input_size=embedding_size,hidden_size=hidden_size,num_layers=num_layers,batch_first=True)# batch_first=True,input of RNN:(batchsize,seqlen,embeddingsize) output of RNN:(batchsize,seqlen,hiddensize)self.fc = torch.nn.Linear(hidden_size, num_class) #從hiddensize 到 類別數量的 變換def forward(self, x):hidden = torch.zeros(num_layers, x.size(0), hidden_size)x = self.emb(x)  # 進行embedding處理,把輸入的長整型張量轉變成嵌入層的稠密型張量x, _ = self.rnn(x, hidden)x = self.fc(x)return x.view(-1, num_class) #為了使用交叉熵,變成一個矩陣(batchsize * seqlen,numclass)net = Model()criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.05)for epoch in range(15):optimizer.zero_grad()outputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()_, idx = outputs.max(dim=1)idx = idx.data.numpy()print('Predicted string: ', ''.join([idx2char_1[x] for x in idx]), end='')print(", Epoch [%d/15] loss = %.3f" % (epoch + 1, loss.item())

🌈我的分享也就到此結束啦🌈
如果我的分享也能對你有幫助,那就太好了!
若有不足,還請大家多多指正,我們一起學習交流!
📢未來的富豪們:點贊👍→收藏?→關注🔍,如果能評論下就太驚喜了!
感謝大家的觀看和支持!最后,?祝愿大家每天有錢賺!!!歡迎關注、關注!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17666.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據集008:吸煙、抽煙檢測數據集(含數據集下載鏈接)

數據集簡介 兩個數據集 一個是783張圖片對應的xml文件 一個是2482張圖片對應的xml文件 如下圖所示: 部分代碼: # 測試數據讀取 def test_data_loader(datadir, batch_size 10, test_image_size608, modetest):"""加載測試用的圖片…

大學生選擇算法向還是嵌入式向?

在開始前剛好我有一些資料,是我根據網友給的問題精心整理了一份「嵌入式的資料從專業入門到高級教程」, 點個關注在評論區回復“888”之后私信回復“888”,全部無償共享給大家!!! 由于嵌入式的薪資待遇和…

品牌建設不迷路:系統化方法讓品牌成長更高效

很多創始人才創業過程中都會發現: 企業越大,遇到的系統性的底層品牌問題就會越多,品牌的系統化建設底層根基如果不穩,后續的增長也會搖搖欲墜。 所以在當今競爭激烈的市場環境中,品牌的成功不僅僅依靠一個響亮的名字…

Spring Boot注解(Annotation)

在Spring Boot中,注解(Annotation)是一種元數據形式,它可以在代碼中提供信息,這些信息可以在運行時或編譯時被處理。Spring Boot使用注解來實現依賴注入、事務管理、配置等功能。 以下是Spring Boot中注解的執行機制的…

【Linux】Linux的權限_1

文章目錄 三、權限1. shell外殼2. Linux的用戶3. Linux權限管理文件訪問者的分類文件類型和訪問權限 未完待續 三、權限 1. shell外殼 為什么要使用shell外殼 由于用戶不擅長直接與操作系統直接接觸和操作系統的易用程度、安全性考慮,用戶不能直接訪問操作系統。 什…

文件IO(一)

文件IO(一) 文件IO文件的分類在文件IO下,文件分類按存儲的內容分按照操作分 標準IO和文件IO的區別系統調用和庫函數的區別 文件IO 把程序暫存在內存的數據,存儲到本地外存上 文件的分類 在Linux系統下,文件共分為7類…

AI答題項目,無門檻答題一小時收益30+

朋友們,今天我想和大家探討一個令人興奮的副業機遇。你是否曾感覺到日常工作的枯燥乏味,而又渴望找到一種輕松的賺錢方式來增加你的收入?今天我將和你分享的這個項目正是你所期待的。 項目的核心是利用AI技術來回答網上付費用戶的問題&…

重生之我要精通JAVA--第六周筆記

File 路徑 相對路徑 路徑1:“a.txt” 路徑2:“abc\\a.txt” 絕對路徑 路徑1:“c:\\a.txt” 路徑2:“c:\\abc\\a.txt” File對象就表示一個路徑,可以是文件的路徑、也可以是文件夾的路徑這個路徑可以是存在的&…

linux線程,線程控制與線程相關概念

線程概念 線程這個詞或多或少大家都聽過,今天我們正式的來談一下線程; 在我一開始的概念中線程就是進程的一部分,一個進程中有很多個線程,這個想法基本是正確的,但細節部分呢我們需要細細講解一下; 什么…

“揭秘:為什么羊駝Ollama成為計算機運行大型語言模型的最佳拍檔?“

最近,AIM 評測了在計算機上本地運行大語言模型(LLM)的最佳工具,Ollama 脫穎而出,成為最高效的解決方案,提供了無與倫比的靈活性。Ollama 是 Jeffrey Morgan 開發的一款開源工具,它正在徹底改變愛…

我被恐嚇了,對方揚言要壓測我的網站

大家好我是聰,昨天真是水逆,在技術群里交流問題,竟然被人身攻擊了!罵的話太難聽具體就不加討論了,人身攻擊我可以接受,我接受不了他竟然說要刷我接口!!!!這下…

啟用標準大頁后內存使用率下降了

未啟用前 [rootol819c ~]# free -htotal used free shared buff/cache available Mem: 9.3Gi 984Mi 379Mi 1.5Gi 8.0Gi 6.8Gi Swap: 15Gi 3.0Mi 15Gi [rootol819c ~]# free -htotal …

【NumPy】掌握NumPy的histogram函數:數據直方圖的生成與應用詳解

🧑 博主簡介:阿里巴巴嵌入式技術專家,深耕嵌入式人工智能領域,具備多年的嵌入式硬件產品研發管理經驗。 📒 博客介紹:分享嵌入式開發領域的相關知識、經驗、思考和感悟,歡迎關注。提供嵌入式方向…

速度百倍提升,高性能 Python 編譯器 Codon 火了

引言 在當下的編程世界里,Python由于其易用性和強大的庫支持在數據科學、人工智能和網頁開發等多個領域占據著舉足輕重的地位。然而,Python的執行速度往往成為開發者的一大痛點。 針對 這一問題,Codon項目正試圖提供一個高效的解決方案。Codo…

java新特性(Stream API)

什么是 Stream API? Stream API 是 Java 8 引入的一個用于對集合數據進行函數式編程操作的強大的庫。它允許我們以一種更簡潔、易讀、高效的方式來處理集合數據,可以極大提高 Java 程序員的生產力,是目前為止對 Java 類庫最好的補充。 Stream API 的核心思想是將數據處理操作…

小識MFC,一套設計優雅與不優雅并存的類庫----小話MFC(2)

Q1: CPoint繼承于POINT,這樣有什么好處? A: 繼承的一個最基本的好處當然就是減少代碼量。CPoint和POINT內部數據一樣,只是一個提供了更多的方法來操作對象。 typedef struct tagPOINT {LONG x;LONG y; } POINT, *P…

【Flutter】動畫介紹隱式動畫

🔥 本文由 程序喵正在路上 原創,CSDN首發! 💖 系列專欄:Flutter學習 🌠 首發時間:2024年5月28日 🦋 歡迎關注🖱點贊👍收藏🌟留言🐾 目…

SpringMvc-restful設計風格

Restful 1、入門1.1 簡介1.2 實例 1、入門 1.1 簡介 RESTFul是什么 RESTFul是WEB服務接口的一種設計風格。 RESTFul定義了一組約束條件和規范&#xff0c;可以讓WEB服務接口更加簡潔、易于理解、易于擴展、安全可靠。 1.2 實例 web.xml <?xml version"1.0"…

5、xss-labs之level6

一、level6-----大小寫繞過 1、測試分析 測試了之前用過的payload&#xff0c;發現都不行&#xff0c;并且level4使用的Java偽協議也不行&#xff0c;可以得出<>、script、onclick都被過濾 2、構造payload 因為href被過濾&#xff0c;可以試一下大寫HREF 初試payload…

沒人愿意和我們最好的工程師一起工作

幾年前&#xff0c;有一位技術非常好的工程師&#xff08;我們叫他“喬恩”&#xff09;為我工作。 他的代碼寫得很好&#xff0c;代碼審查&#xff08;PRs&#xff09;也完成得很快。從技術角度來看&#xff0c;他是個出色的工程師。 但是我們從其他工程師那里得到了一些關于…