[pytorch、學習] - 5.1 二維卷積層

參考

5.1 二維卷積層

卷積神經網絡(convolutional neural network)是含有卷積層(convolutional layer)的神經網絡。本章介紹的卷積神經網絡均使用最常見的二維卷積層。它有高和寬兩個空間維度,常用來處理圖像數據。本節中,我們將介紹簡單形式的二維卷積層的工作原理。

5.1.1 二維互相關運算

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-R6BW7Hcg-1594090508304)(attachment:image.png)]

# 將上述過程實現在 corr2d 函數里.它接受輸入數組 X 與核數組 K,并輸出數組 Y
import torch 
from torch import nndef corr2d(X, K):  # 本函數已保存在d2lzh_pytorch包中方便以后使用h, w = K.shapeY = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i, j] = (X[i: i + h, j: j + w] * K).sum()return Y
X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
K = torch.tensor([[0, 1], [2, 3]])
corr2d(X, K)

在這里插入圖片描述

5.1.2 二維卷積層

二維卷積層將輸入和卷積核做互相運算,并加上一個標量偏差來得到輸出。卷積層的模型參數包括了卷積核和標量偏差。在訓練模型的時候,通常我們先對卷積核進行隨機初始化,然后不斷迭代卷積核和偏差。

下面基于corr2d函數實現一個自定義的二維卷積層。在構造函數__init__里,我們聲明了weightbias這兩個模型參數。前向計算函數forward則是直接調用corr2d函數在加上偏差

class Conv2D(nn.Module):def __init__(self, kernel_size):super(Conv2D, self).__init__()self.weight = nn.Parameter(torch.randn(kernel_size))self.bias = nn.Parameter(torch.randn(1))def forward(self, x):return corr2d(x, self.weight) + self.bias

5.1.3 圖像中物體邊緣檢測

下面我們來看一個卷積的簡單應用: 檢測圖像物體的邊緣,即找到像素變化的位置。首先我們構造一張 6 * 8 的圖像。它中間4列為黑(0),其余為白(1)

X = torch.ones(6, 8)
X[:, 2:6] = 0.
X

在這里插入圖片描述
然后我們構造一個高和寬分別為1和2的卷積核K。當它與輸入做相關運行時,如果橫向相鄰元素相同,輸出為0; 否則輸出為非0.

K = torch.tensor([[1., -1.]])
K

在這里插入圖片描述

下面將輸入X和我們設計的卷積核K做相關運算。可以看出,我們將從白到黑和從黑到白的邊緣分別檢測成了1和-1。其余部分的輸出全是0

Y = corr2d(X, K)
Y

在這里插入圖片描述

5.1.4 通過數據學習核數組

最后我們來看一個例子,它使用物體邊緣檢測中的輸入數據X和輸出數據Y來學習我們構造的核數組K。我們首先構造一個卷積層,其卷積核將被初始化成隨機數組。接下來在每一次迭代中,我們使用平方誤差來比較Y和卷積層的輸出,然后計算梯度來更新權重。

# 構造一個核數組
conv2d = Conv2D(kernel_size=(1, 2))step ,lr = 60 , 0.01for i in range(step):Y_hat = conv2d(X)l = ((Y_hat - Y) ** 2).sum()l.backward()# 梯度下降conv2d.weight.data -= lr * conv2d.weight.gradconv2d.bias.data -= lr * conv2d.bias.grad# 梯度清0conv2d.weight.grad.fill_(0)conv2d.bias.grad.fill_(0)if(i + 1) % 5 == 0:print("Step %d, loss %.5f "% (i+1, l.item()))

在這里插入圖片描述

print(conv2d.weight)
print(conv2d.bias)

在這里插入圖片描述

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

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

相關文章

[51CTO]給您介紹Windows10各大版本之間區別

給您介紹Windows10各大版本之間區別 隨著win10的不斷普及和推廣,越來越多的朋友想安裝win10系統了,但是很多朋友不知道win10哪個版本好用,為了讓大家能夠更好的選擇win10系統版本,下面小編就來告訴你 http://os.51cto.com/art/201…

iOS中NSString轉換成HEX(十六進制)-NSData轉換成int

NSString *str "0xff055008"; //先以16為參數告訴strtoul字符串參數表示16進制數字,然后使用0x%X轉為數字類型 unsigned long red strtoul([str UTF8String],0,16); //strtoul如果傳入的字符開頭是“0x”,那么第三個參數是0,也是會轉為十…

spring-boot注解詳解(七)

Configuration 從Spring3.0,Configuration用于定義配置類,可替換xml配置文件,被注解的類內部包含有一個或多個被Bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行…

[pytorch、學習] - 5.2 填充和步幅

參考 5.2 填充和步幅 5.2.1 填充 填充(padding)是指在輸入高和寬的兩側填充元素(通常是0元素)。圖5.2里我們在原輸入高和寬的兩側分別添加了值為0的元素,使得輸入高和寬從3變成了5,并導致輸出高和寬由2增加到4。圖5.2中的陰影部分為第一個輸出元素及其計算所使用的輸入和核數…

java實現Comparable接口和Comparator接口,并重寫compareTo方法和compare方法

原文地址https://segmentfault.com/a/1190000005738975 實體類:java.lang.Comparable(接口) comareTo(重寫方法),業務排序類 java.util.Comparator(接口) compare(重寫方法). 這兩個接口我們非常的熟悉,但是 在用的時候會有一些不知道怎么下手的感覺&a…

hdu 4714 樹+DFS

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid4714 本來想直接求樹的直徑,再得出答案,后來發現是錯的。 思路:任選一個點進行DFS,對于一棵以點u為根節點的子樹來說,如果它的分支數大于1&#xff0c…

springboot----shiro集成

springboot中集成shiro相對簡單,只需要兩個類:一個是shiroConfig類,一個是CustonRealm類。 ShiroConfig類: 顧名思義就是對shiro的一些配置,相對于之前的xml配置。包括:過濾的文件和權限,密碼加…

[pytorch、學習] - 5.3 多輸入通道和多輸出通道

參考 5.3 多輸入通道和多輸出通道 前面兩節里我們用到的輸入和輸出都是二維數組,但真實數據的維度經常更高。例如,彩色圖像在高和寬2個維度外還有RGB(紅、綠、藍)3個顏色通道。假設彩色圖像的高和寬分別是h和w(像素),那么它可以表示為一個3 * h * w的多維數組。我們將大小為3…

非阻塞算法簡介

在不只一個線程訪問一個互斥的變量時,所有線程都必須使用同步,否則就可能會發生一些非常糟糕的事情。Java 語言中主要的同步手段就是 synchronized 關鍵字(也稱為內在鎖),它強制實行互斥,確保執行 synchron…

springboot---成員初始化順序

如果我們的類有如下成員變量: Component public class A {Autowiredpublic B b; // B is a beanpublic static C c; // C is also a beanpublic static int count;public float version;public A() {System.out.println("This is A constructor.");}Au…

[pytorch、學習] - 5.4 池化層

參考 5.4 池化層 在本節中我們介紹池化(pooling)層,它的提出是為了緩解卷積層對位置的過度敏感性。 5.4.1 二維最大池化層和平均池化層 池化層直接計算池化窗口內元素的最大值或者平均值。該運算也叫做最大池化層或平均池化層。 下面把池化層的前向計算實現在pool2d函數里…

mac上安裝Chromedriver注意事宜

mac上安裝Chromedriver注意事宜: 1.網上下載chromedriver文件或在百度網盤找chromedirver文件 2.將 chromedriver 放置到:/usr/local/bin/,操作如下: 打開Mac終端terminal : 進入 chromedirve文件所在目錄,輸入命令: s…

freemarker教程

FreeMarker的模板文件并不比HTML頁面復雜多少,FreeMarker模板文件主要由如下4個部分組成: 1.文本:直接輸出的部分 2.注釋:<#-- … -->格式部分,不會輸出 3.插值:即${…}或#{…}格式的部分,將使用數據模型中的部分替代輸出 4.FTL指令:FreeMarker指定,和HTML標記類似,名字前…

[pytorch、學習] - 5.5 卷積神經網絡(LeNet)

參考 5.5 卷積神經網絡&#xff08;LeNet&#xff09; 卷積層嘗試解決兩個問題: 卷積層保留輸入形狀,使圖像的像素在高和寬兩個方向上的相關性均可能被有效識別;卷積層通過滑動窗口將同一卷積核和不同位置的輸入重復計算,從而避免參數尺寸過大。 5.5.1 LeNet模型 LeNet分為…

Android內存管理機制

好文摘錄 原作&#xff1a; https://www.cnblogs.com/nathan909/p/5372981.html 1、基于Linux內存管理 Android系統是基于Linux 2.6內核開發的開源操作系統&#xff0c;而linux系統的內存管理有其獨特的動態存儲管理機制。不過Android系統對Linux的內存管理機制進行了優化&…

【Ruby】Ruby 類案例

閱讀目錄 Ruby類案例保存并執行代碼Ruby類案例 下面將創建一個名為 Customer 的 Ruby 類&#xff0c;聲明兩個方法&#xff1a; display_details&#xff1a;該方法用于顯示客戶的詳細信息。total_no_of_customers&#xff1a;該方法用于顯示在系統中創建的客戶總數量。實例 #!…

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

參考 5.6 深度卷積神經網絡&#xff08;AlexNet&#xff09; 在LeNet提出后的將近20年里,神經網絡一度被其他機器學習方法超越,如支持向量機。雖然LeNet可以在早期的小數據集上取得好的成績,但是在更大的真實數據集上的表現并不盡如人意。一方面,神經網絡計算復雜。雖然20世紀…

Springboot---Model,ModelMap,ModelAndView

Model&#xff08;org.springframework.ui.Model&#xff09; Model是一個接口&#xff0c;包含addAttribute方法&#xff0c;其實現類是ExtendedModelMap。 ExtendedModelMap繼承了ModelMap類&#xff0c;ModelMap類實現了Map接口。 public class ExtendedModelMap extends M…

東南亞支付——柬埔寨行

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

Puzzle (II) UVA - 519

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