201204-通過一個A4紙張掃描的例子通俗理解PyTorch中LSTM的引數定義
- 講解
import torch
from torch import nn
import torch.nn.functional as F
# 【第1步】 掃描器引數設定
batch = 10 # 一次同時掃描的紙張數
batchFirst = True # 將bacth設定成input的第一個維度,與CNN等傳統NN保持一致
a4_width = 21 # 掃描器每一個時間步step掃描到的特徵
a4_height = 29 # 掃描器掃描完總共需要的時間步steps,即 seq_len
hidden_size = 210 # 輸入特徵:A4紙(21cm * 29 steps);輸出特徵:Jpeg照片(210 dpi * 29 steps); 深度特徵提取的維度,任意數值
num_layers = 5 # 重複掃描的次數:將第一次掃描好的Jpeg檔案列印出來(1dpi=1cm),繼續掃描,重複之前的步驟
bidirectL = False # 是否同時雙面掃描;並將兩次掃描的結果在同一個Step上進行橫向堆疊
bidirectN = 2 if bidirectL == True else 1 # 記錄掃描方式: 只是單面掃描:1; 同時雙面掃描:2
# 【第2步】 待掃描紙張引數設定
# 每次掃描10張紙:batch = 10:
# 從上到下,掃描完一張紙總的時間步:seq_len = 29
# 從左到右:每秒一次掃描的寬度:input_size = 21
input = torch.randn(batch, a4_height, a4_width) # (batch, seq_len, input_size)
# 【第3步】 掃描器結構效能設定,不需要考慮seq_len,針對同一個batch內不同seq_len要提前做好資料預處理
# input_size =21, hidden_size = 210, num_layers = 2, batch_first: 同CNN邏輯結構,bidirectional:同時掃描
rnn = nn.LSTM(a4_width, hidden_size, num_layers, batch_first = batchFirst, bidirectional=bidirectL)
# 【第4步】 掃描器掃描偏好設定,如果不設定,預設初始狀態全部為零
h0 = torch.randn(num_layers*bidirectN, batch, hidden_size) # num_layers * num_directions, batch, hidden_siz
c0 = torch.randn(num_layers*bidirectN, batch, hidden_size) # num_layers * num_directions, batch, hidden_siz
# 【第5步】輸出掃描結果
# - 如果bacth在第二維度:(seq_len, batch, num_directions * hidden_size)
# - 如果batch在第一維度:(batch, seq_len, num_directions * hidden_size)
output, (hn, cn) = rnn(input, (h0, c0))
print('output: {}; \nhn: {}; \ncn: {}.'.format(output.shape,hn.shape, cn.shape))
# output: torch.Size([10, 29, 210]);
# hn: torch.Size([5, 10, 210]);
# cn: torch.Size([5, 10, 210]).
# [第6步] 編輯並選擇Jpeg影像的全部或區域性
# - 如果需要全部掃描好的影像,則選擇output[:, :,:], 隨後reshape堆疊
# - 如果只需要掃面影像最下面,則選擇output[:,-1,:], 通過index索引
edit = 'last' # or all
select = output[:,-1,:] if edit == 'last' else output[:,:,:]
print('Select: {}'.format(select.shape))
# [第7步] 對映‘編輯選擇好的Jpeg’作為邏輯值,輸出歸一化後的效能指標
map = nn.Linear(210,10)
logits = map(select)
final = F.log_softmax(logits, dim=1)
print('Final: {}'.format(final.shape))
針對同一個batch內不同seq_len要提前做好資料預處理
- 輸出
output: torch.Size([10, 29, 210]);
hn: torch.Size([5, 10, 210]);
cn: torch.Size([5, 10, 210]).
Select: torch.Size([10, 210])
Final: torch.Size([10, 10])
-
理解雙向堆疊
-
理解如何利用所有時間步的全部隱藏特徵
-
理解如何利用最後時間步的高層隱藏特徵
-
如何理解dropout
-
如何理解序列對齊
-
LSTM的多種應用模式
-
Demo下面程式碼供參考,引數可調整
class LSTM(nn.Module):
def __init__(self):
super(LSTM,self).__init__()
self.LSTM1 = nn.LSTM(21,210,batch_first=True,dropout=0.15,num_layers=2)
self.LSTM2 = nn.LSTM(210,64,batch_first=True,dropout=0.15,num_layers=2)
self.LSTM3 = nn.LSTM(64,32,batch_first=True)
self.Logits = nn.Linear(32,10)
def forward(self,x):
x = x.view(-1,29,21) # input of shape (batch, seq_len, input_size):
out,(h_n,c_n) = self.LSTM1(x)
out,(h_n,c_n) = self.LSTM2(out)
out,(h_n,c_n) = self.LSTM3(out)
logits = self.Logits(out[:,-1,:]) # Only select the final feature
output = F.log_softmax(logits, dim=1)
return output
相關文章
- excel怎麼列印到一張a4紙 如何把excel內容列印在一張紙上Excel
- SQL 掃描引數(SARG)SQL
- 巢狀表在表定義中的使用:一個例子巢狀
- 用一個通俗的例子講清楚APIAPI
- 埠掃描工具nmap的常用引數講解
- 關於PB列印設定中紙張的大小
- 透過一個具體的例子理解 npm 的 peerDependencyNPM
- oracle 全表掃描,索引範圍掃描與塊的理解Oracle索引
- 通過shell指令碼防止埠掃描指令碼
- javascript獲取函式定義的引數個數JavaScript函式
- 模型的列表定義中,使用函式時如何定義引數?模型函式
- MySQL中的全表掃描和索引樹掃描MySql索引
- 利用Sonar定製自定義掃描規則
- Mybatis 通過掃描 自動生成別名MyBatis
- python中定義引數的四種方式Python
- Win10系統下將多張圖片縮小列印到一張A4紙上的方法Win10
- C#通過反射獲取類中的方法和引數個數,反射呼叫方法帶引數C#反射
- 機器學習(3),opencv4.0中SVM各個引數的意義,設定機器學習OpenCV
- 理解Javascript中類的定義JavaScript
- Oracle中存取資料掃描Table及索引的方式(全表掃描,索引掃描等)Oracle索引
- 通過原始碼理解 Java 執行緒池的核心引數原始碼Java執行緒
- 通過一個實際的例子學習 combineLatest
- 通過一個案例理解 JWTJWT
- SAP MTA 裡定義 SAP UI5 module 的一個例子UI
- 通過一個簡單的例子,瞭解 Cypress 的執行原理
- [介面測試]通過Class檔案掃描來統計待測應用的介面數
- excel表格剛好適應a4紙大小如何設定 excel怎麼剛好做A4大小的表Excel
- 5分鐘通過一個例子理解觀察者模式和釋出訂閱模式的區別模式
- 一個理解wait()與notify()的例子AI
- Java中的引數傳遞有哪些?通俗易懂Java
- 方法(函式)的定義與引數函式
- pytorch中forward的理解PyTorchForward
- 思通數科紙質檔案掃描與識別與檔案館應用場景介紹
- 通過一個例子學習Kubernetes裡的PersistentVolumeClaim的用法AI
- ReconSage一個快速的線上子域名掃描工具
- SAP MM採購定價過程的一個簡單例子單例
- SQL Server之旅(2):理解萬惡的表掃描SQLServer
- “一個掃描槍一張表”,韻達選擇 TDengine 應對每日億級資料量