1. 程式人生 > >對theano中conv2d函式的理解

對theano中conv2d函式的理解

前言

因為最近在自學CNN,在認識了卷積的一些基本概念後,對卷積過程中的一些過程有困惑,故想借助theano的conv2d函式加深理解。

問題

首先,對於conv2d的輸入,第一層的輸入往往是[多少張圖片,RGB通道數,圖片有多少行,圖片有多少列], 權重的形狀往往是[卷積核數量,三層特徵圖數,卷積核寬,卷積核高]。

假設輸入圖片是[1, 2, 1, 5],權重是[2,2,1,2],那麼卷積的結果是[1, 2, 1, 4]。

明明權重是2*2個1*2,為什麼最後得到的特徵圖數會更前面的卷積核數相同?

其實我們說的卷積核一般都是三維的,它是[上一層特徵圖數,寬,高]。進行卷積運算後還有一個求和的運算,這才是完整的conv2d。

實驗

測試程式碼如下:

inputs = T.tensor4(name='input', dtype='float64')

w_shp = (2, 1, 1, 2)
W = theano.shared(
    np.asarray(
        [
            [[[1., 1.]],
             [[1., 1.]]],
            [[[2., 2.]],
             [[1., 1.]]]
        ],
        dtype=inputs.dtype),
    name='W')

conv_out = conv2d(inputs, W)

f = theano.function([inputs], conv_out)

i = np.asarray([
    [[[1., 2., 3., 4., 5.]]
, [[1., 2., 3., 4., 5.]]] ], dtype='float64') ii = f(i) print(i.shape) print(W.get_value().shape) print(ii) print(ii.shape)

輸出的結果如下:
這裡寫圖片描述

輸入為(1,2,3,4,5),(1,2,3,4,5)
對於第一個卷積核(1,1)(1,1)得到的結果為(3,5,7,9),(3,5,7,9),兩個相加就是第一個輸出(6,10,14,18)。

總結

剛開始學,沒有深入瞭解細節很多時候都會走彎路。特別是剛開始是用的是MNIST的單通道的進行學習,一旦用三通道的就開始傻了。

但是既然該躺的坑都躺過了,後面就沒有什麼可怕的了。

相關推薦

theanoconv2d函式理解

前言 因為最近在自學CNN,在認識了卷積的一些基本概念後,對卷積過程中的一些過程有困惑,故想借助theano的conv2d函式加深理解。 問題 首先,對於conv2d的輸入,第一層的輸入往往是[多少張圖片,RGB通道數,圖片有多少行,圖片有多少列], 權重

C++建構函式、解構函式、虛擬函式及普通成員函式理解

這裡我們主要討論建構函式、解構函式、普通成員函式、虛擬函式,對這幾種函式說說自己的理解。 對建構函式的總結 對建構函式,我們先來看看如下的程式碼 #include <iostream> using namespace std; cla

Yii2 yiiwebUser的理解,和自建的appmodelsUser(基礎版),frontendmodelsUser的應用原理

end his iat getter authent property 用戶id tails uniq yii\web\User 是一個統稱,為用戶,沒有具體實例,只能管理; 此處以app\models\User為基準; app\models\User 是映射數據表us

Tensorflowtensor的理解

存儲 四大 sha 代碼 div body tensor 中括號 flow Tensor即張量,在tensorflow中所有的數據都通過張量流來傳輸,在看代碼的時候,對張量的概念很不解,很容易和矩陣弄混,今天晚上查了點資料,並深入了解了一下,簡單總結一下什麽是張量的階,以及

Theanoscan函式的使用

  Theano作為深度學習領域一個經典的python庫,可以先定義數學表示式再進行運算,開創了符號計算的先河。最近在科研過程中用到了其中的scan()函式,雖然以前也學過這個框架,但是tensorflow永久了,感覺就把一些知識點忘記了,於是想到了寫筆記的重要性,故在這裡記錄下來,以備

微控制器時鐘的理解

1.概述 簡單的說,時鐘是微控制器的脈搏,是微控制器的驅動源,使用任何一個外設都必須開啟相應的時鐘。這樣的好處是,如果不使用一個外設的時候,就把它的時鐘關掉,從而可以降低系統的功耗,達到節能,實現低功耗的效果。每個時鐘tick,系統都會處理一步資料,這樣才能讓工作不出現紊亂。 2.原理

MYSQLschema的理解

MySQL官方文件指出,從概念上講,模式(Schema)是一組相互關聯的資料庫物件,如表,表列,列的資料型別,索引,外來鍵等等。但是從物理層面上來說,模式與資料庫是同義的。你可以在MySQL的SQL語法中用關鍵字SCHEMA替代DATABASE,例如使用CREATE SCHEMA來代替CREATE

c++new的理解

前幾天複習C++教程看到下面的語句 char *p=NULL;    //初始化為NULL的指標 p=new char[20];    //為變數請求記憶體 乍一看註釋,好像是正確的,但是仔細一想,又發現是有問題的 “為變數請求記憶體”

Java“反射”的理解

一、什麼是反射 通過class物件,去使用該檔案中的成員變數、成員方法、構造方法 二、使用 (1)獲取class檔案物件         三種方式:              (a) Class.forName("className")              

續(利用tensorflow實現簡單的卷積神經網路-程式碼相關函式介紹)——遷移學習小記(三)

  上篇文章對cnn進行了一些介紹,附了完整小例子程式碼,介紹了一部分函式概念,但是對我這樣的新手來說,程式碼中涉及的部分函式還是無法一下子全部理解。於是在本文中將對程式碼中使用的函式繼續進行一一介紹。 具體程式碼見上一篇(二) 一、 #定義輸入的placehoder,x是特徵

JS“+”操作符的理解

Questions 你覺得下面這些會輸出啥呢? 1 + '1' ; [1, 2] + [2, 1] ; {}+[]; []+{}; []+[]; {}+{}; The Answers tips 只有當加法運算時,其中一方是字串型別,就會把另一個也轉為字串型別。其他運

面試題(一)- 談談你資料庫索引的理解

轉載自《http://www.cnblogs.com/newpanderking/p/3781043.html》 1、首先要明白無名無實莫要用索引:因為資料中的記錄很多,為了方便我們查詢,提高查詢的效率; 2、索引的原理:對要查詢的欄位建立索引其實就是把該欄位按照一定的

javascriptreduce函式探索

看標題估計很多人都懵了,一個ES內建的函式reduce有什麼好講的 reduce的定義 reduce對陣列中的每個元素執行一個由您提供的reducer函式(升序執行),將其結果彙總然後返回。 reduce的語法 arr.reduce(callback,ini

ConcurrentHashMaprehash函式理解

最近看了ConcurrentHashMap的原始碼,對於這個類的整體原理的講解,請參考 探索 ConcurrentHashMap 高併發性的實現機制     這篇文章將ConcurrentHashMap的工作機制已經講得很清楚了,結合原始碼和相關注釋,就可以很好地理解這個類

OpenCV2.4.13warpAffine函式理解,旋轉,仿射變換,縮放,保持完整圖片

本文借鑑了這裡以及這裡的內容。 問題:為什麼寫這個東西? 答:在進行模板匹配的時候,發現一個問題,對於直接從圖片中摳出的模板,匹配效果較好,但是當模板發生形變的時候,效果就不理想了。 在對模板進行形變處理的時候,發現利用 warpAffine得到的結果並不

RAC RACCommand 的理解和應用

RACSignal 和 RACCommand RACCommand 是 RAC 中的最複雜的一個類之一,它也是一種廣義上的訊號。RAC 中訊號其實是一種物件(或者是不同程式碼塊)之間通訊機制,在面向物件中,類之間的通訊方式主要是方法呼叫,而訊號也是一種呼叫,只

springIOC的理解和使用spring的好處

依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java例項,呼叫者)需要另一個角色(另一個Java例項,被呼叫者)的協助時,在傳統的程式設計過程中,通常由

Java List的理解

現在在實際開發工作中經常用到各種集合類資料,有必要好好總結下 1.基本知識點   (1)形式上為一個集合介面,因為List介面實現了Collection介面,所以List介面擁有Collection

Android逆向之旅---基於so函式加密技術實現so加固

致謝:一、前言今天我們繼續來介紹so加固方式,在前面一篇文章中我們介紹了對so中指定的段(section)進行加密來實現對so加固這篇文章我們延續之前的這篇文章來介紹一下如何對函式進行加密來實現加固,當然這篇文章和前篇文章有很多類似的地方,這裡就不做太多的解釋了,所以還請閱讀

vuenextTick()的理解及使用場景說明

非同步更新佇列: 首先我們要對vue的資料更新有一定理解: vue是依靠資料驅動檢視更新的,該更新的過程是非同步的。 即:當偵聽到你的資料發生變化時, Vue將開啟一個佇列(該佇列被Vue官方稱為非同步更新佇列)。 檢視需要等佇列中所有資料變化完成之後,再統一進行更新。示例: <