日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-02-基于Python的卷积运算

發(fā)布時間:2025/3/21 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-02-基于Python的卷积运算 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文地址可以查看更多信息:http://blog.csdn.net/niuwei22007/article/details/48025939

? ? ? ? 源代碼分析:(注意,如果直接保存以下代碼,一定要另存為UTF8格式,否則報錯)個人理解,歡迎批評指正。


代碼中會用到一個名叫dimshuffle()的函數(shù)。dimshuffle()是一個很強大的工具,但是對于初學(xué)者來說可能會搞不懂到底有什么用,一開始我也是。但是經(jīng)過多次實驗,終于弄懂了dimshuffle()的作用是什么,參見dimshuffle的作用詳解

[python]?view plain?copy
  • import?theano??
  • import?numpy??
  • import?pylab??
  • from?theano?import?tensor?as?T??
  • from?theano.tensor.nnet?import?conv??
  • from?PIL?import?Image??
  • ??
  • #?生成一個隨機數(shù)生成類rng,其seed為23455(隨機數(shù)種子)。????
  • rng?=?numpy.random.RandomState(23455)??
  • ??
  • #?實例化一個4D的輸入tensor,是一個象征性的輸入,相當于形參,需要調(diào)用時傳入一個實參????
  • input?=?T.tensor4(name='input')??
  • ??
  • #?權(quán)值數(shù)組的shape(可以理解為權(quán)值的數(shù)組大小),用來確定需要產(chǎn)生的隨機數(shù)個數(shù),??
  • #(該大小可以理解為是一個?2行3列?的矩陣,其中每個矩陣元素又是一個?9行9列的?矩陣)??
  • w_shp?=?(2,?3,?9,?9)???
  • ??
  • #?每個權(quán)值的邊界,用來確定需要產(chǎn)生的每個隨機數(shù)的范圍。??
  • w_bound?=?numpy.sqrt(3?*?9?*?9)??
  • ??
  • #?rng.uniform(low,hign,size)的作用是產(chǎn)生一個shape為size的均勻分布數(shù)組,每個數(shù)的范圍為(low,high)??
  • #?numpy.asarray(a)的作用是將?類數(shù)組a?轉(zhuǎn)化為array類型??
  • #?theano.shared()實例化一個權(quán)值變量(只是為了進行GPU加速時用),可以調(diào)用W.get_value()查看其value??
  • W?=?theano.shared(?numpy.asarray(??
  • ????????????rng.uniform(??
  • ????????????????low=-1.0?/?w_bound,??
  • ????????????????high=1.0?/?w_bound,??
  • ????????????????size=w_shp),??
  • ????????????dtype=input.dtype),?name?='W')??
  • ??
  • #?下面是用同樣的方法初始化一個偏置值b,b通常被初始化為0,因為它在算法中會有一個被學(xué)習(xí)的過程;??
  • #?但是此處是需要直接用它來計算,所以用隨機值給它初始化,就當做是已經(jīng)經(jīng)過學(xué)習(xí)后的值了。??
  • b_shp?=?(2,)??
  • b?=?theano.shared(numpy.asarray(??
  • ????????????rng.uniform(low=-.5,?high=.5,?size=b_shp),??
  • ????????????dtype=input.dtype),?name?='b')??
  • ??
  • #?conv.conv2d(input,filter)?需要2個輸入,一個是input,一個是filter。????
  • #?input就是上文中的4D張量,每個張量分別代表[mini-batch?size,特征圖的數(shù)量,圖像高度,圖像寬度]。????
  • #?filter就是上文中的W。也是一個4D張量,分別代表[m層特征圖數(shù)量,m-1層特征圖數(shù)量,過濾器高度,過濾器寬度]。????
  • #????
  • #?當其他函數(shù)需要用到變量conv_out時,會先把實參input傳入conv2d()中,再計算出conv_out????
  • #??
  • conv_out?=?conv.conv2d(input,?W)??
  • ??
  • #?dimshuffle是一個很強大的能輕松改變一個張量結(jié)構(gòu)的工具。b.dimshuffle('x',?0,?'x',?'x')??
  • #?就是把b的原始的第0列向量的左側(cè)添加一個維度,在其右側(cè)添加兩個維度。??
  • #?b原來是個一維數(shù)據(jù)(2),經(jīng)過dimshuffle之后,則變成了一個四維數(shù)據(jù)(1*2*1*1)。??
  • #?dimshuffle具體的操作,參見文章一開始。??
  • output?=?T.nnet.sigmoid(conv_out?+?b.dimshuffle('x',?0,?'x',?'x'))??
  • ??
  • #?創(chuàng)建一個用來過濾圖像的theano.function(可以把f編譯為c,然后就可以隨時拿來用了。)????
  • #????
  • #?當其他函數(shù)需要調(diào)用f時(調(diào)用形式為f(input)),需要傳入實參input,然后將計算結(jié)果存入output中。????
  • #????
  • f?=?theano.function([input],?output)??
  • ??
  • #?下面開始處理幾幅圖片來看一下效果??
  • #?打開一幅圖片,源代碼中有2個"open",應(yīng)該是在linux中的語法,我是在windows上運行的,所以改成1個open????
  • img?=?Image.open('g:\\b.jpg')??
  • ??
  • #?得到圖片的寬度和高度(注意,順序一定不要弄反)??
  • img_w,?img_h?=?img.size??
  • ??
  • #?將圖片像素按照(高度,寬度,通道數(shù)量)格式化為array數(shù)組??
  • #?其實就是將圖片數(shù)據(jù)格式化為一個數(shù)組,因為每個像素點包括3個字節(jié),B,G,R,且其范圍為0-255,??
  • #?這個地方最后將其除以256是為了歸一化,歸一化后的數(shù)據(jù)是float64類型??
  • img?=?numpy.asarray(img,?dtype='float32')?/?256.??
  • ??
  • #?圖片的原始數(shù)據(jù)是一個3D數(shù)據(jù)【高,寬,通道數(shù)量】,????
  • #?經(jīng)過數(shù)據(jù)置換(transpose(2,0,1))之后,變成了【通道數(shù)量,高,寬】,????
  • #?因為f中傳入?yún)?shù)需要4D,因此需要將圖片數(shù)據(jù)reshape成為一個【1,?通道數(shù)量,?高,?寬】這樣的4D張量,????
  • #?reshape的參數(shù)一定要注意,1就是最外的那一維度,3就是通道數(shù)量,然后是【高】和【寬】,????
  • #?這樣結(jié)果的?img_.shape?=【1,?3,?寬,?高】???
  • #??
  • #?為什么reshape為這樣的size呢?因為調(diào)用f時需要傳入一個input,而這個input就是4D,最終的這個input是傳入到????
  • #?conv2d中的第一個參數(shù),而那個參數(shù)的格式是什么呢?[mini-batch?size,特征圖的數(shù)量,圖像高度,圖像寬度]??
  • #?這樣就串起來了吧,第一個參數(shù)是batch?size,據(jù)我所知應(yīng)該是指卷積核的數(shù)量吧,但是不知道為什么這里是1???
  • #?第二個參數(shù)代表輸入層的特征圖數(shù)量,這個地方是3,其實就是把一張彩色圖片按照3個通道作為3個特征圖進行輸入;??
  • #?最后兩個是圖像的高度和寬度,正好一一對應(yīng)。??
  • #??
  • img_?=?img.transpose(2,?0,?1).reshape(1,?3,?img_h,?img_w)??
  • ??
  • ??
  • #?將img_作為f的參數(shù),經(jīng)過計算得到輸出??
  • filtered_img?=?f(img_)??
  • ??
  • #?將原始圖片顯示出來??
  • pylab.subplot(1,?3,?1);?pylab.axis('off');?pylab.imshow(img)??
  • #?圖片灰度化??
  • pylab.gray();??
  • ??
  • #?分別顯示不同處理后的圖片??
  • pylab.subplot(1,?3,?2);?pylab.axis('off');?pylab.imshow(filtered_img[0,?0,?:,?:])??
  • pylab.subplot(1,?3,?3);?pylab.axis('off');?pylab.imshow(filtered_img[0,?1,?:,?:])??
  • pylab.show()??



  • 運行結(jié)果:


    參考資料:

    1.原始教程

    2.小白安裝Theano


    《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-02-基于Python的卷积运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。