十二、Sequential

一、Sequential介紹

torch.nn.Sequential(*args)
在這里插入圖片描述
由官網給的Example可以大概了解到Sequential是將多層網絡進行便捷整合,方便可視化以及簡化網絡復雜性

二、復現網絡模型訓練CIFAR-10數據集

在這里插入圖片描述
這里面有個Hidden units隱藏單元其實就是連個線性層
把隱藏層全部展開整個神經網絡架構如下:
在這里插入圖片描述

①輸入圖像為3通道的(32,32)圖像,(C,H,W)=(3,32,32)

在這里插入圖片描述

②通過一層(5,5)的卷積Convolution,輸出特征圖為(32,32,32),特征圖的(H,W),通過(5,5)的卷積核大小沒有發生變換,這說明卷積層肯定對原始圖像進行了加邊

在這里插入圖片描述

查看下官網給的卷積層padding的計算公式
在這里插入圖片描述
分析一下:
在這里插入圖片描述
故padding = 2,加了兩成外邊,之所以channel由3變成了32,是因為卷積核有多個并非一個卷積核
最終:輸入3通道;輸出32通道;stride = 1;padding = 2;dilation = 1(默認值);kernel_size = 5;
torch.nn.Conv2d(in_channels=3,out_channels=32,kernel_size=5,stride=1,padding=2)

③接著將(32,32,32)特征通過Max-Pooling,池化核為(2,2),輸出為(32,16,16)的特征圖

在這里插入圖片描述
torch.nn.MaxPool2d(kernel_size=2)

④接著將(32,16,16)特征圖通過(5,5)大小的卷積核進行卷積,輸出特征圖為(32,16,16),特征圖的(H,W),通過(5,5)的卷積核大小沒有發生變換,這說明卷積層肯定對原始圖像進行了加邊

在這里插入圖片描述

同理根據官網給的計算公式可以求出padding = 2

在這里插入圖片描述
通過上面兩次的計算可以看出,只要通過卷積核大小為(5,5),卷積之后的大小不變則padding肯定為2

故padding = 2,加了兩成外邊,這里channel由32變成了32,可以得知僅使用了一個卷積核
最終:輸入32通道;輸出32通道;stride = 1;padding = 2;dilation = 1(默認值);kernel_size = 5;
torch.nn.Conv2d(in_channels=32,out_channels=32,kernel_size=5,stride=1,padding=2)

⑤接著將(32,16,16)的特征圖通過Max-Pooling,池化核為(2,2),輸出為(32,8,8)的特征圖

在這里插入圖片描述
torch.nn.MaxPool2d(kernel_size=2)

⑥再將(32,8,8)的特征圖輸入到卷積核為(5,5)的卷積層中,得到(64,8,8)特征圖,特征圖的(H,W),通過(5,5)的卷積核大小沒有發生變換,這說明卷積層肯定對原始圖像進行了加邊,由前兩次的計算得出的結果可以得知padding=2,這里channel由32變成了64,是因為使用了多個卷積核分別進行卷積

在這里插入圖片描述
torch.nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, stride=1, padding=2)

⑦再將(64,8,8)的特征圖通過Max-Pooling,池化核為(2,2),輸出為(64,4,4)的特征圖

在這里插入圖片描述
torch.nn.MaxPool2d(kernel_size=2)

⑧再將(64,4,4)的特征圖進行Flatten展平成(1024)特征

torch.nn.Flatten()
在這里插入圖片描述

⑨再將(1024)特征傳入第一個Linear層,輸出(64)

在這里插入圖片描述
torch.nn.Linear(1024,64)

⑩最后將(64)特征圖經過第二個Linear層,輸出(10),從而達到CIFAR-10數據集的10分類任務

在這里插入圖片描述
torch.nn.Linear(64,10)

三、傳統神經網絡實現

import torch
from torch import nn
from torch.nn import Conv2d
from torch.utils.tensorboard import SummaryWriterclass Beyond(nn.Module):def __init__(self):super(Beyond,self).__init__()self.conv_1 = torch.nn.Conv2d(in_channels=3,out_channels=32,kernel_size=5,stride=1,padding=2)self.maxpool_1 = torch.nn.MaxPool2d(kernel_size=2)self.conv_2 = torch.nn.Conv2d(in_channels=32,out_channels=32,kernel_size=5,stride=1,padding=2)self.maxpool_2 = torch.nn.MaxPool2d(kernel_size=2)self.conv_3 = torch.nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, stride=1, padding=2)self.maxpool_3 = torch.nn.MaxPool2d(kernel_size=2)self.flatten = torch.nn.Flatten()self.linear_1 = torch.nn.Linear(1024,64)self.linear_2 = torch.nn.Linear(64,10)def forward(self,x):x = self.conv_1(x)x = self.maxpool_1(x)x = self.conv_2(x)x = self.maxpool_2(x)x = self.conv_3(x)x = self.maxpool_3(x)x = self.flatten(x)x = self.linear_1(x)x = self.linear_2(x)return xbeyond = Beyond()
print(beyond)
"""
Beyond((conv_1): Conv2d(3, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(maxpool_1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(conv_2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(maxpool_2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(conv_3): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(maxpool_3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(flatten): Flatten(start_dim=1, end_dim=-1)(linear_1): Linear(in_features=1024, out_features=64, bias=True)(linear_2): Linear(in_features=64, out_features=10, bias=True)
)
"""input = torch.zeros((64,3,32,32))
print(input.shape)#torch.Size([64, 3, 32, 32])
output = beyond(input)
print(output.shape)#torch.Size([64, 10])#將網絡圖上傳值tensorboard中進行可視化展示
writer = SummaryWriter("y_log")
writer.add_graph(beyond,input)
writer.close()

在Terminal下運行tensorboard --logdir=y_log --port=7870,logdir為打開事件文件的路徑,port為指定端口打開;
通過指定端口2312進行打開tensorboard,若不設置port參數,默認通過6006端口進行打開。

在這里插入圖片描述

在這里插入圖片描述

四、使用Sequential實現神經網絡

import torch
from torch import nn
from torch.nn import Conv2d
from torch.utils.tensorboard import SummaryWriterclass Beyond(nn.Module):def __init__(self):super(Beyond,self).__init__()self.model = torch.nn.Sequential(torch.nn.Conv2d(3,32,5,padding=2),torch.nn.MaxPool2d(2),torch.nn.Conv2d(32,32,5,padding=2),torch.nn.MaxPool2d(2),torch.nn.Conv2d(32,64,5,padding=2),torch.nn.MaxPool2d(2),torch.nn.Flatten(),torch.nn.Linear(1024,64),torch.nn.Linear(64,10))def forward(self,x):x = self.model(x)return xbeyond = Beyond()
print(beyond)
"""
Beyond((conv_1): Conv2d(3, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(maxpool_1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(conv_2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(maxpool_2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(conv_3): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(maxpool_3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(flatten): Flatten(start_dim=1, end_dim=-1)(linear_1): Linear(in_features=1024, out_features=64, bias=True)(linear_2): Linear(in_features=64, out_features=10, bias=True)
)
"""input = torch.zeros((64,3,32,32))
print(input.shape)#torch.Size([64, 3, 32, 32])
output = beyond(input)
print(output.shape)#torch.Size([64, 10])#將網絡圖上傳值tensorboard中進行可視化展示
writer = SummaryWriter("y_log")
writer.add_graph(beyond,input)
writer.close()

在Terminal下運行tensorboard --logdir=y_log --port=7870,logdir為打開事件文件的路徑,port為指定端口打開;
通過指定端口2312進行打開tensorboard,若不設置port參數,默認通過6006端口進行打開。

在這里插入圖片描述

在這里插入圖片描述

實現效果是完全一樣的,使用Sequential看起來更加簡介,可視化效果更好些。

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

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

相關文章

1064-快速排序

描述 給定輸入排序元素數目n和相應的n個元素,寫出程序,利用內排序算法中快速排序算法進行排序,并輸出排序最后結果的相應序列。 輸入 共兩行,第一行給出排序元素數目n,第二行給出n個元素,1≤n≤100000&…

社交問答:取代BBS的Web2.0革命

編者按:本文由樂維UP創始人俞越撰寫,你也可以點擊這里關注俞越的新浪微博。 BBS在中國的興起是在95年,之后以驚人的速度發展起來。從2011年開始,國內的問答社區也如當年的BBS一樣,大量涌現快速成長,大體分為…

單調棧 leetcode整理(三)

目錄42. 接雨水思路分析901. 股票價格跨度思路581. 最短無序連續子數組思路一:排序雙指針思路二:單調棧思路三:雙指針(最省時)42. 接雨水 42. 接雨水 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子&…

python 摳圖 鋸齒_Python | 繪圖中的抗鋸齒

python 摳圖 鋸齒Antialiasing is another important feature of Matplotlib and in this article, we will review how to use this functionality. pyplot.antialiased() is an inbuilt function in matplotlib.pyplot which performs our required operation. 抗鋸齒是Matpl…

apk 反編譯

引用:http://code.google.com/p/dex2jar/issues/detail?id20 最新版:dex2jar http://code.google.com/p/dex2jar/downloads/list 錯誤:http://code.google.com/p/dex2jar/issues/detail?id20 這段時間在學Android應用開發,在想既然是用Jav…

OpenDiscussion_DataDrivenDesign

本文源于公司內部技術交流,如有不當之處,還請指正。 Content: 1. What is Data-driven design?2. WPF revolution.3. More about ObservableCollection.4. Question.1. What is Data-driven design?Data-driven design: is a design of usi…

十三、Loss Functions

一、Loss Functions損失函數 損失函數的作用: 1,損失函數就是實際輸出值和目標值之間的差 2,由這個差便可以通過反向傳播對之后的數據進行更新 Loss Functions官網給的API 里面由很多種損失函數,不同的損失函數有其不同的用途及表…

leetcode 滑動窗口小結 (一)

目錄小結以及代碼框架76. 最小覆蓋子串滑動窗口代碼以及注釋567. 字符串的排列滑動窗口438. 找到字符串中所有字母異位詞3. 無重復字符的最長子串化簡框架reference小結以及代碼框架 滑動窗口技巧屬于雙指針技巧。 該算法的思路為維護一個窗口,不斷滑動&#xff0c…

linux命令行界面_Linux中的命令行界面

linux命令行界面If you are like most people, you are probably most familiar with using a Graphical User Interface (GUI) to control your computer. Introduced to the masses by Apple on the Macintosh computer and popularized by Microsoft, a GUI provides an eas…

一道小小面試題的細節分析

一道小小面試題的細節分析 今天突然想到以前遇到的一個問題,題目如下(可能絕大多數人都遇到過): 1 class A2 {3 public A()4 {5 PrintFields();6 }7 public virtual void Pr…

十四、OPTIM

一、torch.optim torch.optim.Optimizer(params, defaults)優化器官網說明 由官網給的使用說明打開看出來優化器實驗步驟: ①構造選擇優化器 例如采用隨機梯度下降優化器SGD torch.optim.SGD(beyond.parameters(),lr0.01),放入beyond模型的參數param…

Windows下運行jekyll,編碼已不再是問題

很久沒更新jekyll了,所以好奇著去官網看了下更新記錄,發現如下更新條目(版本1.3.0/2013-11-04發布): Add encoding configuration option (#1449)之前在windows下安裝jekyll運行編寫的代碼時,如果有中文&am…

leetcode 滑動窗口小結 (二)

目錄424. 替換后的最長重復字符思考分析1優化1004. 最大連續1的個數 III友情提醒方法1,基于當前最大頻數方法2,基于歷史最大頻數424. 替換后的最長重復字符 https://leetcode-cn.com/problems/longest-repeating-character-replacement/ 給你一個僅由大…

軟件故障_一些主要的軟件故障

軟件故障The need for software engineering was realized by the software industry after some of its major failures. Some of these failures are listed below, 在經歷了一些重大失敗之后,軟件行業意識到了對軟件工程的需求 。 下面列出了其中一些故障&#x…

十五、修改VGG16網絡來適應自己的需求

一、VGG-16 VGG-16神經網絡是所訓練的數據集為ImageNet ImageNet數據集中驗證集和測試集一萬五千張,有一千個類別 二、加載VGG-16神經網絡模型 VGG16模型使用說明 torchvision.models.vgg16(pretrainedFalse) 其中參數pretrained表示是否下載已經通過ImageNet數…

leetcode 滑動窗口小結 (三)

目錄978. 最長湍流子數組題目思路分析以及代碼1052. 愛生氣的書店老板題目思考分析與初步代碼優化思路以及優化代碼1208. 盡可能使字符串相等題目思考分析以及代碼978. 最長湍流子數組 https://leetcode-cn.com/problems/longest-turbulent-subarray/ 題目 當 A 的子數組 A[…

JAVA多線程學習3--線程一些方法

一、通過sleep方法睡眠 在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行)。該線程不丟失任何監視器的所屬權。 二、線程優先級 線程具有優先級,范圍為1-10。 MAX_PRIORITY線程可以具有的最高優先級。int類型,值為10. MIN_PRIO…

mcq 隊列_MCQ | 量子密碼學

mcq 隊列1) Which possible Attacks in Quantum Cryptography can take place? 1)量子密碼術中可能發生哪些攻擊? Possible Attacks in Quantum Cryptography and Birthday Attack 量子密碼術和生日攻擊的可能攻擊 Birthday attack and Boomerang attack 生日襲擊…

《inside the c++ object model》讀書筆記 之一:對象

關于對象 ...引子:在C語言中,"數據"和"處理數據的操作(函數)"是分開來聲明的,語言本身并沒有支持"數據和函數"之間關聯性,這種程序成為"程序性的",由一組"分布在各個一功能為向導的函數中"的算法驅動,他們處理的是共同的外部…

十六、保存和加載自己所搭建的網絡模型

一、保存自己搭建的模型方法一 例如:基于VGG16網絡模型架構的基礎上加上了一層線性層,最后的輸出為10類 torch.save(objmodule,f"path"),傳入需要保存的模型名稱以及要保存的路徑位置 保存模型結構和模型的參數,保存文…