色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PyTorch教程-5.2. 多層感知器的實現

jf_pJlTbmA9 ? 來源:PyTorch ? 作者:PyTorch ? 2023-06-05 15:43 ? 次閱讀

多層感知器 (MLP) 的實現并不比簡單的線性模型復雜多少。關鍵的概念差異是我們現在連接多個層。

import torch
from torch import nn
from d2l import torch as d2l

from mxnet import np, npx
from mxnet.gluon import nn
from d2l import mxnet as d2l

npx.set_np()

import jax
from flax import linen as nn
from jax import numpy as jnp
from d2l import jax as d2l

No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)

import tensorflow as tf
from d2l import tensorflow as d2l

5.2.1. 從零開始實施

讓我們從頭開始實現這樣一個網絡

5.2.1.1. 初始化模型參數

回想一下,Fashion-MNIST 包含 10 個類,并且每個圖像由一個28×28=784灰度像素值網格。和以前一樣,我們暫時忽略像素之間的空間結構,因此我們可以將其視為具有 784 個輸入特征和 10 個類別的分類數據集。首先,我們將實現一個具有一個隱藏層和 256 個隱藏單元的 MLP。層數和寬度都是可調的(它們被認為是超參數)。通常,我們選擇層寬度可以被 2 的較大次冪整除。由于內存在硬件中分配和尋址的方式,這在計算上是高效的。

同樣,我們將用幾個張量表示我們的參數。請注意, 對于每一層,我們必須跟蹤一個權重矩陣和一個偏置向量。與往常一樣,我們?yōu)檫@些參數的損失梯度分配內存。

在下面的代碼中,我們使用 `nn.Parameter< https://pytorch.org/docs/stable/generated/torch.nn.parameter.Parameter.html >`__ 自動將類屬性注冊為要跟蹤的參數autograd(第 2.5 節(jié)) .

class MLPScratch(d2l.Classifier):
  def __init__(self, num_inputs, num_outputs, num_hiddens, lr, sigma=0.01):
    super().__init__()
    self.save_hyperparameters()
    self.W1 = nn.Parameter(torch.randn(num_inputs, num_hiddens) * sigma)
    self.b1 = nn.Parameter(torch.zeros(num_hiddens))
    self.W2 = nn.Parameter(torch.randn(num_hiddens, num_outputs) * sigma)
    self.b2 = nn.Parameter(torch.zeros(num_outputs))

In the code below, we first define and initialize the parameters and then enable gradient tracking.

class MLPScratch(d2l.Classifier):
  def __init__(self, num_inputs, num_outputs, num_hiddens, lr, sigma=0.01):
    super().__init__()
    self.save_hyperparameters()
    self.W1 = np.random.randn(num_inputs, num_hiddens) * sigma
    self.b1 = np.zeros(num_hiddens)
    self.W2 = np.random.randn(num_hiddens, num_outputs) * sigma
    self.b2 = np.zeros(num_outputs)
    for param in self.get_scratch_params():
      param.attach_grad()

In the code below we use `flax.linen.Module.param `__ to define the model parameter.

class MLPScratch(d2l.Classifier):
  num_inputs: int
  num_outputs: int
  num_hiddens: int
  lr: float
  sigma: float = 0.01

  def setup(self):
    self.W1 = self.param('W1', nn.initializers.normal(self.sigma),
               (self.num_inputs, self.num_hiddens))
    self.b1 = self.param('b1', nn.initializers.zeros, self.num_hiddens)
    self.W2 = self.param('W2', nn.initializers.normal(self.sigma),
               (self.num_hiddens, self.num_outputs))
    self.b2 = self.param('b2', nn.initializers.zeros, self.num_outputs)

In the code below we use `tf.Variable `__ to define the model parameter.

class MLPScratch(d2l.Classifier):
  def __init__(self, num_inputs, num_outputs, num_hiddens, lr, sigma=0.01):
    super().__init__()
    self.save_hyperparameters()
    self.W1 = tf.Variable(
      tf.random.normal((num_inputs, num_hiddens)) * sigma)
    self.b1 = tf.Variable(tf.zeros(num_hiddens))
    self.W2 = tf.Variable(
      tf.random.normal((num_hiddens, num_outputs)) * sigma)
    self.b2 = tf.Variable(tf.zeros(num_outputs))

5.2.1.2. 模型

為了確保我們知道一切是如何工作的,我們將自己實現 ReLU 激活,而不是直接調用內置relu函數。

def relu(X):
  a = torch.zeros_like(X)
  return torch.max(X, a)

def relu(X):
  return np.maximum(X, 0)

def relu(X):
  return jnp.maximum(X, 0)

def relu(X):
  return tf.math.maximum(X, 0)

由于我們忽略了空間結構,我們將reshape每個二維圖像轉換為長度為 的平面向量num_inputs。最后,我們只用幾行代碼就實現了我們的模型。由于我們使用框架內置的 autograd,這就是它所需要的全部。

@d2l.add_to_class(MLPScratch)
def forward(self, X):
  X = X.reshape((-1, self.num_inputs))
  H = relu(torch.matmul(X, self.W1) + self.b1)
  return torch.matmul(H, self.W2) + self.b2

@d2l.add_to_class(MLPScratch)
def forward(self, X):
  X = X.reshape((-1, self.num_inputs))
  H = relu(np.dot(X, self.W1) + self.b1)
  return np.dot(H, self.W2) + self.b2

@d2l.add_to_class(MLPScratch)
def forward(self, X):
  X = X.reshape((-1, self.num_inputs))
  H = relu(jnp.matmul(X, self.W1) + self.b1)
  return jnp.matmul(H, self.W2) + self.b2

@d2l.add_to_class(MLPScratch)
def forward(self, X):
  X = tf.reshape(X, (-1, self.num_inputs))
  H = relu(tf.matmul(X, self.W1) + self.b1)
  return tf.matmul(H, self.W2) + self.b2

5.2.1.3. 訓練

幸運的是,MLP 的訓練循環(huán)與 softmax 回歸完全相同。我們定義模型、數據、訓練器,最后fit在模型和數據上調用方法。

model = MLPScratch(num_inputs=784, num_outputs=10, num_hiddens=256, lr=0.1)
data = d2l.FashionMNIST(batch_size=256)
trainer = d2l.Trainer(max_epochs=10)
trainer.fit(model, data)

poYBAGR9NJeAcxmqAAGBExPEUqc353.svg

model = MLPScratch(num_inputs=784, num_outputs=10, num_hiddens=256, lr=0.1)
data = d2l.FashionMNIST(batch_size=256)
trainer = d2l.Trainer(max_epochs=10)
trainer.fit(model, data)

poYBAGR9NJmAGTC8AAGCCLiJXcw943.svg

model = MLPScratch(num_inputs=784, num_outputs=10, num_hiddens=256, lr=0.1)
data = d2l.FashionMNIST(batch_size=256)
trainer = d2l.Trainer(max_epochs=10)
trainer.fit(model, data)

pYYBAGR9NJyAM_ysAAGCybKjia0271.svg

model = MLPScratch(num_inputs=784, num_outputs=10, num_hiddens=256, lr=0.1)
data = d2l.FashionMNIST(batch_size=256)
trainer = d2l.Trainer(max_epochs=10)
trainer.fit(model, data)

pYYBAGR9NJ6AeFYhAAGBuQZFjtY204.svg

5.2.2. 簡潔的實現

正如您所料,通過依賴高級 API,我們可以更簡潔地實現 MLP。

5.2.2.1. 模型

與我們對 softmax 回歸實現的簡潔實現(第 4.5 節(jié))相比,唯一的區(qū)別是我們添加了兩個完全連接的層,而我們之前只添加了 一個。第一個是隱藏層,第二個是輸出層。

class MLP(d2l.Classifier):
  def __init__(self, num_outputs, num_hiddens, lr):
    super().__init__()
    self.save_hyperparameters()
    self.net = nn.Sequential(nn.Flatten(), nn.LazyLinear(num_hiddens),
                 nn.ReLU(), nn.LazyLinear(num_outputs))

class MLP(d2l.Classifier):
  def __init__(self, num_outputs, num_hiddens, lr):
    super().__init__()
    self.save_hyperparameters()
    self.net = nn.Sequential()
    self.net.add(nn.Dense(num_hiddens, activation='relu'),
           nn.Dense(num_outputs))
    self.net.initialize()

class MLP(d2l.Classifier):
  num_outputs: int
  num_hiddens: int
  lr: float

  @nn.compact
  def __call__(self, X):
    X = X.reshape((X.shape[0], -1)) # Flatten
    X = nn.Dense(self.num_hiddens)(X)
    X = nn.relu(X)
    X = nn.Dense(self.num_outputs)(X)
    return X

class MLP(d2l.Classifier):
  def __init__(self, num_outputs, num_hiddens, lr):
    super().__init__()
    self.save_hyperparameters()
    self.net = tf.keras.models.Sequential([
      tf.keras.layers.Flatten(),
      tf.keras.layers.Dense(num_hiddens, activation='relu'),
      tf.keras.layers.Dense(num_outputs)])

以前,我們forward為模型定義了使用模型參數轉換輸入的方法。這些操作本質上是一個管道:您獲取一個輸入并應用一個轉換(例如,矩陣與權重相乘,然后是偏差加法),然后重復使用當前轉換的輸出作為下一個轉換的輸入。但是,您可能已經注意到 forward這里沒有定義任何方法。實際上,從類(第 3.2.2 節(jié)MLP)繼承 方法以簡單地調用 (是輸入),現在定義為通過類進行的一系列轉換。該類抽象了前向過程,使我們能夠專注于轉換。我們將進一步討論如何forwardModuleself.net(X)XSequentialSequentialSequential類在第 6.1.2 節(jié)中起作用 。

5.2.2.2. 訓練

訓練循環(huán)與我們實現 softmax 回歸時完全相同。這種模塊化使我們能夠將有關模型架構的問題與正交考慮分開。

model = MLP(num_outputs=10, num_hiddens=256, lr=0.1)
trainer.fit(model, data)

poYBAGR9NKGAMJGUAAF5pOY74F4213.svg

model = MLP(num_outputs=10, num_hiddens=256, lr=0.1)
trainer.fit(model, data)

pYYBAGR9NKSANquDAAF72nzDx0M343.svg

model = MLP(num_outputs=10, num_hiddens=256, lr=0.1)
trainer.fit(model, data)

pYYBAGR9NKeAEH6HAAF08_rOZ80451.svg

model = MLP(num_outputs=10, num_hiddens=256, lr=0.1)
trainer.fit(model, data)

poYBAGR9NKmAX8IxAAGKzgziMks047.svg

5.2.3. 概括

現在我們在設計深度網絡方面有了更多的實踐,從單層到多層深度網絡的步驟不再構成如此重大的挑戰(zhàn)。特別是,我們可以重用訓練算法和數據加載器。但請注意,從頭開始實施 MLP 仍然很麻煩:命名和跟蹤模型參數使得擴展模型變得困難。例如,假設想要在第 42 層和第 43 層之間插入另一層。這可能是第 42b 層,除非我們愿意執(zhí)行順序重命名。此外,如果我們從頭開始實施網絡,框架就很難執(zhí)行有意義的性能優(yōu)化。

盡管如此,您現在已經達到了 1980 年代后期的最先進水平,當時完全連接的深度網絡是神經網絡建模的首選方法。我們的下一個概念性步驟將是考慮圖像。在我們這樣做之前,我們需要回顧一些關于如何有效計算模型的統計基礎知識和細節(jié)。

5.2.4. 練習

更改隱藏單元的數量num_hiddens并繪制其數量如何影響模型的準確性。這個超參數的最佳值是多少?

嘗試添加隱藏層以查看它如何影響結果。

為什么用單個神經元插入隱藏層是個壞主意?會出什么問題?

改變學習率如何改變你的結果?在所有其他參數固定的情況下,哪個學習率能給你最好的結果?這與紀元數有何關系?

讓我們聯合優(yōu)化所有超參數,即學習率、時期數、隱藏層數和每層隱藏單元數。

通過對所有這些進行優(yōu)化可以獲得的最佳結果是什么?

為什么處理多個超參數更具挑戰(zhàn)性?

描述聯合優(yōu)化多個參數的有效策略。

比較框架的速度和從頭開始實施一個具有挑戰(zhàn)性的問題。它如何隨著網絡的復雜性而變化?

測量對齊良好和未對齊矩陣的張量矩陣乘法的速度。例如,測試維度為 1024、1025、1026、1028 和 1032 的矩陣。

這在 GPU 和 CPU 之間有何變化?

確定 CPU 和 GPU 的內存總線寬度。

嘗試不同的激活函數。哪一個效果最好?

網絡的權重初始化之間是否存在差異?有關系嗎?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 感知器
    +關注

    關注

    0

    文章

    34

    瀏覽量

    11849
  • pytorch
    +關注

    關注

    2

    文章

    808

    瀏覽量

    13251
收藏 人收藏

    評論

    相關推薦

    DL:DL單層感知器Perceptron的原理及Perceptron Can not solve XOR problem

    DL:DL單層感知器Perceptron的原理及PerceptronCan not solveXOR problem
    發(fā)表于 12-21 10:35

    上海邏迅門磁感知器系統方案

    `上海邏迅門磁感知器方案`
    發(fā)表于 02-18 13:33

    如何使用Keras框架搭建一個小型的神經網絡多層感知器

    本文介紹了如何使用Keras框架,搭建一個小型的神經網絡-多層感知器,并通過給定數據進行計算訓練,最好將訓練得到的模型提取出參數,放在51單片機上進行運行。
    發(fā)表于 11-22 07:00

    多層感知器在提高軟件可維護性上的應用

    預測分析軟件質量可看作是一個以源代碼度量作為屬性標簽、模塊性能作為類標簽的分類問題。首次提出將多層感知器應用于軟件質量預測,并使用對稱不定性分析來提高其分類性能。
    發(fā)表于 04-06 00:01 ?20次下載

    多層感知器和反向傳播進行入門級的介紹

    本文對多層感知器和反向傳播進行入門級的介紹。人工神經網絡是一種計算模型,啟發(fā)自人類大腦處理信息的生物神經網絡。 人工神經網絡是一種計算模型,啟發(fā)自人類大腦處理信息的生物神經網絡。人工神經網絡在語音識別、計算機視覺和文本處理領域取得了一系列突破,讓機器學習研究和產業(yè)感到了興
    發(fā)表于 11-15 15:26 ?4601次閱讀

    人工智能–多層感知器基礎知識解讀

    感知器(Perceptron)是ANN人工神經網絡的一個概念,由Frank Rosenblatt于1950s第一次引入。 MLP多層感知器是一種前向結構的ANN人工神經網絡, 多層
    發(fā)表于 07-05 14:45 ?6139次閱讀

    利用人工神經網絡感知器實現雙足行走機器人的穩(wěn)定性控制

    本文采用的神經網絡感知器(Perception)是最簡單的人工神經網絡,它是FRosenblatt于1958年提出的具有自學習能力的感知器。在這種人工神經網絡中,記憶的信息存儲在連接權上,外部刺激
    的頭像 發(fā)表于 09-20 07:55 ?2059次閱讀
    利用人工神經網絡<b class='flag-5'>感知器</b><b class='flag-5'>實現</b>雙足行走機器人的穩(wěn)定性控制

    使用MATLAB編寫單層感知器的函數免費下載

    本文檔的主要內容詳細介紹的是使用MATLAB編寫單層感知器的函數免費下載。
    發(fā)表于 08-13 16:55 ?4次下載

    上海邏迅官網資訊:門磁感知器SG6AD系統架構方案有哪些?

    上海邏迅官網資訊:門磁感知器SG6AD系統架構方案有哪些? 門磁感知器SG6AD是邏迅公司研發(fā)生產的一種應用于物聯網智能監(jiān)測感知器。通過磁性感應、位移等多種傳感結合,實時監(jiān)測門的開關
    發(fā)表于 04-24 10:09 ?895次閱讀

    關于無線水壓傳感(感知器)SG9A01的屬性介紹

    現今世界是科技突飛猛進的時代,我們不僅僅能夠探索大自然,更能通過大自然的力量改善我們的生活,無線壓力傳感(感知器)就是其中之一,而無線水壓傳感(感知器)更是與我們的生活息息相關。
    發(fā)表于 10-23 15:25 ?993次閱讀

    無線水壓感知器(傳感)SG9A01的參數是怎樣的

    現今世界是科技突飛猛進的時代,我們不僅僅能夠探索大自然,更能通過大自然的力量改善我們的生活,無線壓力傳感(感知器)就是其中之一,而無線水壓傳感(感知器)更是與我們的生活息息相關。
    發(fā)表于 10-23 15:27 ?1183次閱讀

    PyTorch教程5.2多層感知器實現

    電子發(fā)燒友網站提供《PyTorch教程5.2多層感知器實現.pdf》資料免費下載
    發(fā)表于 06-05 15:32 ?0次下載
    <b class='flag-5'>PyTorch</b>教程<b class='flag-5'>5.2</b>之<b class='flag-5'>多層</b><b class='flag-5'>感知器</b>的<b class='flag-5'>實現</b>

    使用多層感知器進行機器學習

    我們將使用一個極其復雜的微處理實現一個神經網絡,該神經網絡可以完成與由少數晶體管組成的電路相同的事情,這個想法有些幽默。但與此同時,以這種方式思考這個問題強調了單層感知器作為一般分類和函數逼近工具的不足——如果我們的
    的頭像 發(fā)表于 06-24 11:17 ?569次閱讀
    使用<b class='flag-5'>多層</b><b class='flag-5'>感知器</b>進行機器學習

    多層感知器、全連接網絡和深度神經網絡介紹

    多層感知器(MLP)、全連接網絡(FCN)和深度神經網絡(DNN)在神經網絡領域中扮演著重要角色,它們之間既存在緊密聯系,又各具特色。以下將從定義、結構、功能及應用等方面詳細闡述這三者之間的關系。
    的頭像 發(fā)表于 07-11 17:25 ?5215次閱讀

    多層感知器的基本原理

    多層感知器(MLP, Multi-Layer Perceptron)是一種前饋神經網絡,它通過引入一個或多個隱藏層來擴展單層感知器的功能,從而能夠解決復雜的非線性問題。BP網絡,即基于反向傳播算法
    的頭像 發(fā)表于 07-19 17:20 ?860次閱讀
    主站蜘蛛池模板: 亚洲国产精品第一影院在线观看| 狠很橹快播| 色一伦一情一区二区三区| 好大好爽好深舒服死了| 97综合久久| 野花韩国中文版免费观看| 日本调教网站| 免费高清毛片| 国产人妻系列无码专区97SS| cntv官网| 最近日本字幕MV免费观看在线 | 蜜桃TV成人网站免费打开| 国产欧美日韩国产高清| qvod免费电影| 69xx欧美| 野花韩国高清完整版在线观看5| 午夜福利体检| 日本亚洲精品无码区国产电影 | 久久爽狠狠添AV激情五月| 国产精品久久久久秋霞影视| 百性阁综合社区| 99精品国产免费久久久久久下载| 亚洲偷偷自拍免费视频在线| 亚洲a免费| 无码人妻精品一区二区蜜桃在线看| 欧美人与动牲交A精品| 老湿机一区午夜精品免费福利| 黄页免费观看| 国产午夜在线观看视频播放| 国产XXXXXX农村野外| 抽插喷S骚爽去了H| 白洁在线观看| AV亚洲精品少妇毛片无码| 97一期涩涩97片久久久久久久 | 俄罗斯bbbbbbbbb大片| 成人性生交大片免费看中文| xx在线观看| 厕所xxxxx| 儿子好妈妈的HD3中字抢劫| 工口肉肉彩色不遮挡| 高清无码色大片中文|