一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python LeNet網絡詳解及pytorch實現

Python LeNet網絡詳解及pytorch實現

2022-03-07 00:08Serins Python

LeNet主要用來進行手寫字符的識別與分類,并在美國的銀行中投入了使用。本文主要為大家詳細介紹了LetNet以及通過pytorch實現LetNet,感興趣的小伙伴可以學習一下

1.LeNet介紹

LeNet神經網絡由深度學習三巨頭之一的Yan LeCun提出,他同時也是卷積神經網絡 (CNN,Convolutional Neural Networks)之父。LeNet主要用來進行手寫字符的識別與分類,并在美國的銀行中投入了使用。LeNet的實現確立了CNN的結構,現在神經網絡中的許多內容在LeNet的網絡結構中都能看到,例如卷積層,Pooling層,ReLU層。雖然LeNet早在20世紀90年代就已經提出了,但由于當時缺乏大規模的訓練數據,計算機硬件的性能也較低,因此LeNet神經網絡在處理復雜問題時效果并不理想。雖然LeNet網絡結構比較簡單,但是剛好適合神經網絡的入門學習。

 

2.LetNet網絡模型

LeNet網絡模型一般指LeNet-5,相信大家學習這個模型的時候一定都見過這張圖片吧

Python LeNet網絡詳解及pytorch實現

這張圖也是原論文中的一張模型圖,這樣子看可能會覺得有點不習慣,下面這張圖是本人在drawio軟件上制作的網絡模型圖,如下:

Python LeNet網絡詳解及pytorch實現

糾正一下,上圖中第二個Conv2d層后面的計算結果應該為10,寫成了5

相信學習了卷積神經網絡基礎的朋友們應該能很清晰的看懂這張圖吧,對于右邊的計算在圖的左上角也給出了公式,上圖中每一層的輸入形狀以及輸出形狀我都詳細的為大家寫出來了,對于計算公式和模型大致的結構,看下面這張圖也可以(建議對應上下圖一起看更容易理解)

Python LeNet網絡詳解及pytorch實現

LeNet-5網絡模型簡單的就包含了卷積層,最大池化層,全連接層以及relu,softmax激活函數,模型中的輸入圖片大小以及每一層的卷積核個數,步長都是模型制定好的,一般不要隨意修改,能改的是最后的輸出結果,即分類數量(num_classes)。flatten操作也叫扁平化操作,我們都知道輸入到全連接層中的是一個個的特征,及一維向量,但是卷積網絡特征提取出來的特征矩陣并非一維,要送入全連接層,所以需要flatten操作將它展平成一維。

 

3.pytorch實現LeNet

python代碼如下

from torch import nn
import torch
import torch.nn.functional as F

'''
  說明:
  1.LeNet是5層網絡
  2.nn.ReLU(inplace=True)  參數為True是為了從上層網絡Conv2d中傳遞下來的tensor直接進行修改,這樣能夠節省運算內存,不用多存儲其他變量
  3.本模型的維度注釋均省略了N(batch_size)的大小,即input(3, 32, 32)-->input(N, 3, 32, 32)
  4.nn.init.xavier_uniform_(m.weight)
   用一個均勻分布生成值,填充輸入的張量或變量,結果張量中的值采樣自U(-a, a),
   其中a = gain * sqrt( 2/(fan_in + fan_out))* sqrt(3),
   gain是可選的縮放因子,默認為1
   'fan_in'保留前向傳播時權值方差的量級,'fan_out'保留反向傳播時的量級
  5.nn.init.constant_(m.bias, 0)
    為所有維度tensor填充一個常量0
'''


class LeNet(nn.Module):
  def __init__(self, num_classes=10, init_weights=False):
      super(LeNet, self).__init__()
      self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=5, stride=1)
      self.maxpool1 = nn.MaxPool2d(kernel_size=2, stride=2)
      self.relu = nn.ReLU(True)

      self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=5, stride=1)
      self.maxpool2 = nn.MaxPool2d(kernel_size=2, stride=2)

      self.fc1 = nn.Linear(32 * 5 * 5, 120)
      self.fc2 = nn.Linear(120, 84)
      self.fc3 = nn.Linear(84, num_classes)

      if init_weights:
          self._initialize_weights()

  def forward(self, x):
      x = self.conv1(x)  # input(3, 32, 32)  output(16, 28, 28)
      x = self.relu(x)  # 激活函數
      x = self.maxpool1(x)  # output(16, 14, 14)
      x = self.conv2(x)  # output(32, 10, 10)
      x = self.relu(x)  # 激活函數
      x = self.maxpool2(x)  # output(32, 5, 5)
      x = torch.flatten(x, start_dim=1)  # output(32*5*5) N代表batch_size
      x = self.fc1(x)  # output(120)
      x = self.relu(x)  # 激活函數
      x = self.fc2(x)  # output(84)
      x = self.relu(x)  # 激活函數
      x = self.fc3(x)  # output(num_classes)

      return x

  def _initialize_weights(self):
      for m in self.modules():
          if isinstance(m, nn.Conv2d):
              nn.init.xavier_uniform_(m.weight)
              if m.bias is not None:
                  nn.init.constant_(m.bias, 0)
          elif isinstance(m, nn.Linear):
              nn.init.xavier_uniform_(m.weight)
              nn.init.constant_(m.bias, 0)

或者

下面這一種沒有自己初始化權重和偏置,就會使用默認的初始化方式

import torch.nn as nn
import torch.nn.functional as F
import torch


class LeNet(nn.Module):
  def __init__(self):
      super(LeNet, self).__init__()
      self.conv1 = nn.Conv2d(3, 16, 5)
      self.pool1 = nn.MaxPool2d(2, 2)
      self.conv2 = nn.Conv2d(16, 32, 5)
      self.pool2 = nn.MaxPool2d(2, 2)
      self.fc1 = nn.Linear(32*5*5, 120)
      self.fc2 = nn.Linear(120, 84)
      self.fc3 = nn.Linear(84, 10)

  def forward(self, x):
      x = F.relu(self.conv1(x))   # output(16, 28, 28)
      x = self.pool1(x)           # output(16, 14, 14)
      x = F.relu(self.conv2(x))   # output(32, 10, 10)
      x = self.pool2(x)           # output(32, 5, 5)
      x = x.view(x.size(0), -1)      # output(32*5*5)
      x = F.relu(self.fc1(x))     # output(120)
      x = F.relu(self.fc2(x))     # output(84)
      x = self.fc3(x)             # output(10)
      return x

nn.Linear就是全連接層,除了最后一個全連接層,其它均需要relu激活,默認無padding操作

nn.Conv2d對應的參數順序一定要記住:

1.in_channels:輸入的通道數或者深度

2.out_channels:輸出的通道數或者深度

3.kernel_size:卷積核的大小

4.stride:步長大小,默認1

5.padding:padding的大小,默認0

6.dilation:膨脹大小,默認1,暫時用不到

7.group:分組組數,默認1

8.bias:默認True,布爾值,是否用偏置值

9.padding_mode:默認用0填充

記不住參數順序也沒關系,但需要記住參數名稱

參考文章:pytorch實現LeNet網絡模型的訓練及預測

以上就是Python LeNet網絡詳解及pytorch實現的詳細內容,更多關于Python LeNet網絡實現的資料請關注服務器之家其它相關文章!

原文鏈接:https://blog.csdn.net/Serins/article/details/121470862

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产真实伦对白在线播放 | 成年女人毛片免费观看97 | 禁忌4中文 | 韩剧消失的眼角膜免费完整版 | 6080伦理久久精品亚洲 | 精新精新国产自在现 | 久久精品视频在线看 | 久久免费看少妇高潮A片特爽 | 免费欧美视频 | 蜜桃视频一区二区三区四区 | 久久精品成人免费看 | 欧美国产日韩在线播放 | 国产成人在线小视频 | 青青草在线播放 | 视频一区二区三区欧美日韩 | 亚洲视频999 | 青青青青青国产费线在线观看 | 亚洲精品中文字幕久久久久久 | 亚洲欧美另类专区 | 女暴露狂校园裸露小说 | 欧美专区视频 | 青青草影院在线观看 | jux539原千岁在线播放 | 国产成人www | 成人国产网站v片免费观看 成人国产精品视频 | 美女禁区视频免费观看精选 | 精品日产1区2卡三卡麻豆 | 999久久免费高清热精品 | 日韩免费一级片 | 天天射久久 | 亚洲成人精品久久 | 日本福利片国产午夜久久 | 五月色婷婷久久综合 | 午夜精品久久久久久中宇 | a一级毛片录像带 录像片 | 四虎最新永久免费网址 | 91短视频在线播放 | 男人j放进女人的p免费看视频 | bl动漫在线观看 | 色综合久久天天综合观看 | 国产精品久久久久久影院 |