[pytorch、學習] - 5.6 深度卷積神經網絡(AlexNet)

參考

5.6 深度卷積神經網絡(AlexNet)

在LeNet提出后的將近20年里,神經網絡一度被其他機器學習方法超越,如支持向量機。雖然LeNet可以在早期的小數據集上取得好的成績,但是在更大的真實數據集上的表現并不盡如人意。一方面,神經網絡計算復雜。雖然20世紀90年代也有過一些針對神經網絡的加速硬件,但并沒有像之后GPU那樣大量普及。因此,訓練一個多通道、多層和有大量參數的卷積神經網絡在當年很難完成。另一方面,當年研究者還沒有大量深入研究參數初始化和非凸優化算法等諸多領域,導致復雜的神經網絡的訓練通常較困難。

在很長一段時間里更流行的是研究者通過勤勞與智慧所設計并生成的手工特征。這類圖像分類研究的主要流程是:

  1. 獲取圖像數據集;
  2. 使用已有的特征提取函數生成圖像的特征;
  3. 使用機器學習模型對圖像的特征分類。

當時認為的機器學習部分僅限最后這一步。如果那時候跟機器學習研究者交談,他們會認為機器學習既重要又優美。優雅的定理證明了許多分類器的性質。機器學習領域生機勃勃、嚴謹而且極其有用。然而,如果跟計算機視覺研究者交談,則是另外一幅景象。他們會告訴你圖像識別里“不可告人”的現實是:計算機視覺流程中真正重要的是數據和特征。也就是說,使用較干凈的數據集和較有效的特征甚至比機器學習模型的選擇對圖像分類結果的影響更大。

5.6.1 學習特征表示

研究者相信,多層神經網絡可能可以學得數據的多級表征,并逐級表示越來越抽象的概念。以圖像分類為例:在多層神經網絡中,圖像的第一級的表示可以是在特定位置和角度是否出現邊緣;而第二級的表示說不定能夠將這些邊緣組合出有趣的模式,如花紋;在第三級的表示中,也許上以及的花紋能進一步匯合成對應物體特定部位的模式。這樣逐級表示下去,最終,模型能夠較容易根據最后一級的表示完成分類任務。需要強調的是,輸入的逐級表示由多層模型中的參數決定,而這些參數都是學習出來的。

5.6.1.1 缺失要素一: 數據

包含許多特征的深度模型需要大量的有標簽的數據才能表現得比其他經典方法更好。限于早期計算機有限的存儲和90年代有限的研究預算,大部分研究只基于小的公開數據集。例如,不少研究論文基于加州大學歐文分校(UCI)提供的若干個公開數據集,其中許多數據集只有幾百至幾千張圖像。這一狀況在2010年前后興起的大數據浪潮中得到改善。特別是,2009年誕生的ImageNet數據集包含了1,000大類物體,每類有多達數千張不同的圖像。這一規模是當時其他公開數據集無法與之相提并論的。ImageNet數據集同時推動計算機視覺和機器學習研究進入新的階段,使此前的傳統方法不再有優勢。

5.6.1.2 缺失要素二: 硬件

深度學習對計算資源要求很高。早期的硬件計算能力有限,這使訓練較復雜的神經網絡變得很困難。然而,通用GPU的到來改變了這一格局。很久以來,GPU都是為圖像處理和計算機游戲設計的,尤其是針對大吞吐量的矩陣和向量乘法從而服務于基本的圖形變換。值得慶幸的是,這其中的數學表達與深度網絡中的卷積層的表達類似。通用GPU這個概念在2001年開始興起,涌現出諸如OpenCL和CUDA之類的編程框架。這使得GPU也在2010年前后開始被機器學習社區使用。

5.6.2 AlexNet

在這里插入圖片描述

下面實現簡化過的AlexNet

import time
import torch
import torch.nn as nn
import torch.optim as optim
import torchvisionimport sys
sys.path.append("..")
import d2lzh_pytorch as d2ldevice = torch.device("cuda" if torch.cuda.is_available() else 'cpu')class AlexNet(nn.Module):def __init__(self):super(AlexNet, self).__init__()self.conv = nn.Sequential(# N = (W - F + 2P)/S + 1,除不盡向下取整(記不清了,向上取整對不上,向下取整剛好對上...)nn.Conv2d(1, 96, 11, 4),   # in_channels, out_channels, kernel_size, stride, padding: (256, 1, 224, 224) -> (256, 96, 54,54)nn.ReLU(),nn.MaxPool2d(3, 2),   # kernel_size, stride: (256, 96, 54, 54) -> (256, 96, 26, 26)# 減少卷積窗口,使用填充為2來使得輸入的高和寬一致,且增大輸出通道數nn.Conv2d(96, 256, 5, 1, 2),  # (256, 96, 26, 26) -> (256, 256, 26, 26)nn.ReLU(),nn.MaxPool2d(3, 2),  # (256, 256, 26, 26) -> (256, 256, 12, 12)# 連續3個卷積層,且使用更小的卷積窗口。除了最后的卷積層外,進一步增大了輸出通道數。# 前兩個卷積層不使用池化層來減小輸入的高和寬nn.Conv2d(256, 384, 3, 1, 1),   # (256, 256, 12, 12) -> (256, 384, 12, 12)nn.ReLU(),nn.Conv2d(384, 384, 3, 1, 1),  # (256, 384, 12, 12) -> (256, 384, 12, 12)nn.ReLU(),nn.Conv2d(384, 256, 3, 1, 1),  # (256, 384, 12, 12) -> (256, 256, 12, 12)nn.ReLU(),nn.MaxPool2d(3,2)  # (256, 256, 12, 12) -> (256, 256, 5, 5))# 這里全連接層的輸出個數比LeNet中的大數倍。使用丟棄層來緩解過擬合self.fc = nn.Sequential(nn.Linear(256*5*5, 4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096, 4096),nn.ReLU(),nn.Dropout(0.5),# 輸出層。由于這里使用Fashion-MNIST,所以用類別數為10nn.Linear(4096, 10),)def forward(self, img):feature = self.conv(img)  # 256 * 1 * 224 * 224output = self.fc(feature.view(img.shape[0], -1))return output
net = AlexNet()
print(net)

在這里插入圖片描述

5.6.3 讀取數據

def load_data_fashion_mnist(batch_size, resize= None, root="~/Datasets/FashionMNIST"):trans = []if resize:trans.append(torchvision.transforms.Resize(size = resize))trans.append(torchvision.transforms.ToTensor())transform = torchvision.transforms.Compose(trans)mnist_train = torchvision.datasets.FashionMNIST(root=root, train=True, download=True, transform=transform)mnist_test = torchvision.datasets.FashionMNIST(root=root, train=False, download=True, transform=transform)train_iter = torch.utils.data.DataLoader(mnist_train, batch_size = batch_size, shuffle=True, num_workers=4)test_iter = torch.utils.data.DataLoader(mnist_test, batch_size = batch_size, shuffle=False, num_workers=4)return train_iter, test_iterbatch_size = 128
train_iter, test_iter = load_data_fashion_mnist(batch_size, resize = 224)

5.6.4 訓練

lr, num_epochs = 0.001, 5
optimizer = optim.Adam(net.parameters(), lr =lr)
d2l.train_ch5(net, train_iter, test_iter, batch_size, optimizer, device, num_epochs)

在這里插入圖片描述

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

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

相關文章

Springboot---Model,ModelMap,ModelAndView

Model(org.springframework.ui.Model) Model是一個接口,包含addAttribute方法,其實現類是ExtendedModelMap。 ExtendedModelMap繼承了ModelMap類,ModelMap類實現了Map接口。 public class ExtendedModelMap extends M…

東南亞支付——柬埔寨行

考察時間:2018.5.28 至 2018.6.6 為了解柬埔寨大概國情和市場,在柬埔寨開展了為期近10天的工作。 觀察了交通情況,周邊街道的店面與商品,攤販等,也走訪了大學校區,看了永旺商超、本地超市和中國超市&#x…

Puzzle (II) UVA - 519

題目鏈接: https://vjudge.net/problem/UVA-519 思路: 剪枝回溯 這個題巧妙的是他按照表格的位置開始搜索,也就是說表格是定的,他不斷用已有的圖片從(0,0)開始拼到(n-1,m-1) 剪枝的地方: 1.由于含F的面只能拼到邊上&am…

[pytorch、學習] - 5.7 使用重復元素的網絡(VGG)

參考 5.7 使用重復元素的網絡(VGG) AlexNet在LeNet的基礎上增加了3個卷積層。但AlexNet作者對它們的卷積窗口、輸出通道數和構造順序均做了大量的調整。雖然AlexNet指明了深度卷積神經網絡可以取得出色的結果,但并沒有提供簡單的規則以指導…

springboot---mybits整合

配置 POM文件 <parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.6.RELEASE</version><relativePath /> </parent><properties><proj…

使用airdrop進行文件共享

使用airdrop進行文件共享 學習了&#xff1a; https://support.apple.com/zh-cn/HT203106 https://zh.wikihow.com/%E5%9C%A8Mac%E4%B8%8A%E7%94%A8%E8%BF%91%E6%9C%BA%E6%8D%B7%E4%BC%A0%EF%BC%88Airdrop%EF%BC%89%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6 轉載于:https://www.cn…

【鏈表】逆序打印鏈表

1 public class Main {2 3 // 逆序打印鏈表4 public void reversePrint(Node node) {5 if (node null){6 return;7 }8 reversePrint(node.next);9 System.out.println(node.data); 10 } 11 12 public Node crea…

[pytorch、學習] - 5.8 網絡中的網絡(NiN)

參考 5.8 網絡中的網絡&#xff08;NiN&#xff09; 前幾節介紹的LeNet、AlexNet和VGG在設計上的共同之處是&#xff1a;先以由卷積層構成的模塊充分抽取空間特征&#xff0c;再以由全連接層構成的模塊來輸出分類結果。其中&#xff0c;AlexNet和VGG對LeNet的改進主要在于如何…

springboot---集成mybits方法

SpringBoot集成mybatis配置 一個有趣的現象&#xff1a;傳統企業大都喜歡使用hibernate,互聯網行業通常使用mybatis&#xff1b;之所以出現這個問題感覺與對應的業務有關&#xff0c;比方說&#xff0c;互聯網的業務更加的復雜&#xff0c;更加需要進行靈活性的處理&#xff0c…

jQuery源碼解讀

參考 &#xff1a; https://www.cnblogs.com/yuqingfamily/p/5785593.html 轉載于:https://www.cnblogs.com/wfblog/p/9172622.html

info.plist文件里面添加描述 - 配置定位,相冊等

<key>NSAppleMusicUsageDescription</key> <string>App需要您的同意,才能訪問媒體資料庫</string> <key>NSBluetoothPeripheralUsageDescription</key> <string>App需要您的同意,才能訪問藍牙</string> <key>NSCalendar…

[pytorch、學習] - 5.9 含并行連結的網絡(GoogLeNet)

參考 5.9 含并行連結的網絡&#xff08;GoogLeNet&#xff09; 在2014年的ImageNet圖像識別挑戰賽中&#xff0c;一個名叫GoogLeNet的網絡結構大放異彩。它雖然在名字上向LeNet致敬&#xff0c;但在網絡結構上已經很難看到LeNet的影子。GoogLeNet吸收了NiN中網絡串聯網絡的思…

mybits注解詳解

一、mybatis 簡單注解 關鍵注解詞 &#xff1a; Insert &#xff1a; 插入sql , 和xml insert sql語法完全一樣 Select &#xff1a; 查詢sql, 和xml select sql語法完全一樣 Update &#xff1a; 更新sql, 和xml update sql語法完全一樣 Delete &#xff1a; 刪除sql, 和xml d…

使用python裝飾器計算函數運行時間的實例

使用python裝飾器計算函數運行時間的實例 裝飾器在python里面有很重要的作用&#xff0c; 如果能夠熟練使用&#xff0c;將會大大的提高工作效率 今天就來見識一下 python 裝飾器&#xff0c;到底是怎么工作的。 本文主要是利用python裝飾器計算函數運行時間 一些需要精確的計算…

SQLServer用存儲過程實現插入更新數據

實現 1&#xff09;有同樣的數據&#xff0c;直接返回&#xff08;返回值&#xff1a;0&#xff09;。 2&#xff09;有主鍵同樣。可是數據不同的數據。進行更新處理&#xff08;返回值&#xff1a;2&#xff09;&#xff1b; 3&#xff09;沒有數據&#xff0c;進行插入數據處…

[pytorch、學習] - 9.1 圖像增廣

參考 9.1 圖像增廣 在5.6節(深度卷積神經網絡)里我們提過,大規模數據集是成功應用神經網絡的前提。圖像增廣(image augmentation)技術通過對訓練圖像做一系列隨機改變,來產生相似但又不相同的訓練樣本,從而擴大訓練數據集的規模。圖像增廣的另一種解釋是,隨機改變訓練樣本可以…

mysql綠色版安裝

導讀&#xff1a;MySQL是一款關系型數據庫產品&#xff0c;官網給出了兩種安裝包格式&#xff1a;MSI和ZIP。MSI格式是圖形界面安裝方式&#xff0c;基本只需下一步即可&#xff0c;這篇文章主要介紹ZIP格式的安裝過程。ZIP Archive版是免安裝的。只要解壓就行了。 一、首先下…

在微信瀏覽器字體被調大導致頁面錯亂的解決辦法

iOS的解決方案是覆蓋掉微信的樣式&#xff1a; body { /* IOS禁止微信調整字體大小 */-webkit-text-size-adjust: 100% !important; } 安卓的解決方案是通過 WeixinJSBridge 對象將網頁的字體大小設置為默認大小&#xff0c;并且重寫設置字體大小的方法&#xff0c;讓用戶不能在…

[pytorch、學習] - 9.2 微調

參考 9.2 微調 在前面得一些章節中,我們介紹了如何在只有6萬張圖像的Fashion-MNIST訓練數據集上訓練模型。我們還描述了學術界當下使用最廣泛規模圖像數據集ImageNet,它有超過1000萬的圖像和1000類的物體。然而,我們平常接觸到數據集的規模通常在這兩者之間。 假設我們想從圖…

Springboot默認加載application.yml原理

Springboot默認加載application.yml原理以及擴展 SpringApplication.run(…)默認會加載classpath下的application.yml或application.properties配置文件。公司要求搭建的框架默認加載一套默認的配置文件demo.properties&#xff0c;讓開發人員實現“零”配置開發&#xff0c;但…