1. 程式人生 > >【TensorFlow】理解tf.nn.conv2d方法 ( 附程式碼詳解註釋 )

【TensorFlow】理解tf.nn.conv2d方法 ( 附程式碼詳解註釋 )

最近在研究學習TensorFlow,在做識別手寫數字的demo時,遇到了tf.nn.conv2d這個方法,查閱了官網的API 發現講得比較簡略,還是沒理解。google了一下,參考了網上一些朋友寫得部落格,結合自己的理解,差不多整明白了。

方法定義

tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

引數:
  • **input : ** 輸入的要做卷積的圖片,要求為一個張量,shape為 [ batch, in_height, in_weight, in_channel ],其中batch為圖片的數量,in_height 為圖片高度,in_weight 為圖片寬度,in_channel 為圖片的通道數,灰度圖該值為1,彩色圖為3。(也可以用其它值,但是具體含義不是很理解)
  • filter: 卷積核,要求也是一個張量,shape為 [ filter_height, filter_weight, in_channel, out_channels ],其中 filter_height 為卷積核高度,filter_weight 為卷積核寬度,in_channel 是影象通道數 ,和 input 的 in_channel 要保持一致,out_channel 是卷積核數量。
  • strides: 卷積時在影象每一維的步長,這是一個一維的向量,[ 1, strides, strides, 1],第一位和最後一位固定必須是1
  • padding: string型別,值為“SAME” 和 “VALID”,表示的是卷積的形式,是否考慮邊界。"SAME"是考慮邊界,不足的時候用0去填充周圍,"VALID"則不考慮
  • use_cudnn_on_gpu: bool型別,是否使用cudnn加速,預設為true

具體實現

import tensorflow as tf
# case 1
# 輸入是1張 3*3 大小的圖片,影象通道數是5,卷積核是 1*1 大小,數量是1
# 步長是[1,1,1,1]最後得到一個 3*3 的feature map
# 1張圖最後輸出就是一個 shape為[1,3,3,1] 的張量
input = tf.Variable(tf.random_normal([1,3,3,5]))
filter = tf.Variable(tf.random_normal([1,1,5,1]))
op1 =
tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='SAME') # case 2 # 輸入是1張 3*3 大小的圖片,影象通道數是5,卷積核是 2*2 大小,數量是1 # 步長是[1,1,1,1]最後得到一個 3*3 的feature map # 1張圖最後輸出就是一個 shape為[1,3,3,1] 的張量 input = tf.Variable(tf.random_normal([1,3,3,5])) filter = tf.Variable(tf.random_normal([2,2,5,1])) op2 = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='SAME') # case 3 # 輸入是1張 3*3 大小的圖片,影象通道數是5,卷積核是 3*3 大小,數量是1 # 步長是[1,1,1,1]最後得到一個 1*1 的feature map (不考慮邊界) # 1張圖最後輸出就是一個 shape為[1,1,1,1] 的張量 input = tf.Variable(tf.random_normal([1,3,3,5])) filter = tf.Variable(tf.random_normal([3,3,5,1])) op3 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID') # case 4 # 輸入是1張 5*5 大小的圖片,影象通道數是5,卷積核是 3*3 大小,數量是1 # 步長是[1,1,1,1]最後得到一個 3*3 的feature map (不考慮邊界) # 1張圖最後輸出就是一個 shape為[1,3,3,1] 的張量 input = tf.Variable(tf.random_normal([1,5,5,5])) filter = tf.Variable(tf.random_normal([3,3,5,1])) op4 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID') # case 5 # 輸入是1張 5*5 大小的圖片,影象通道數是5,卷積核是 3*3 大小,數量是1 # 步長是[1,1,1,1]最後得到一個 5*5 的feature map (考慮邊界) # 1張圖最後輸出就是一個 shape為[1,5,5,1] 的張量 input = tf.Variable(tf.random_normal([1,5,5,5])) filter = tf.Variable(tf.random_normal([3,3,5,1])) op5 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME') # case 6 # 輸入是1張 5*5 大小的圖片,影象通道數是5,卷積核是 3*3 大小,數量是7 # 步長是[1,1,1,1]最後得到一個 5*5 的feature map (考慮邊界) # 1張圖最後輸出就是一個 shape為[1,5,5,7] 的張量 input = tf.Variable(tf.random_normal([1,5,5,5])) filter = tf.Variable(tf.random_normal([3,3,5,7])) op6 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME') # case 7 # 輸入是1張 5*5 大小的圖片,影象通道數是5,卷積核是 3*3 大小,數量是7 # 步長是[1,2,2,1]最後得到7個 3*3 的feature map (考慮邊界) # 1張圖最後輸出就是一個 shape為[1,3,3,7] 的張量 input = tf.Variable(tf.random_normal([1,5,5,5])) filter = tf.Variable(tf.random_normal([3,3,5,7])) op7 = tf.nn.conv2d(input, filter, strides=[1, 2, 2, 1], padding='SAME') # case 8 # 輸入是10 張 5*5 大小的圖片,影象通道數是5,卷積核是 3*3 大小,數量是7 # 步長是[1,2,2,1]最後每張圖得到7個 3*3 的feature map (考慮邊界) # 10張圖最後輸出就是一個 shape為[10,3,3,7] 的張量 input = tf.Variable(tf.random_normal([10,5,5,5])) filter = tf.Variable(tf.random_normal([3,3,5,7])) op8 = tf.nn.conv2d(input, filter, strides=[1, 2, 2, 1], padding='SAME') init = tf.initialize_all_variables() with tf.Session() as sess: sess.run(init) print('*' * 20 + ' op1 ' + '*' * 20) print(sess.run(op1)) print('*' * 20 + ' op2 ' + '*' * 20) print(sess.run(op2)) print('*' * 20 + ' op3 ' + '*' * 20) print(sess.run(op3)) print('*' * 20 + ' op4 ' + '*' * 20) print(sess.run(op4)) print('*' * 20 + ' op5 ' + '*' * 20) print(sess.run(op5)) print('*' * 20 + ' op6 ' + '*' * 20) print(sess.run(op6)) print('*' * 20 + ' op7 ' + '*' * 20) print(sess.run(op7)) print('*' * 20 + ' op8 ' + '*' * 20) print(sess.run(op8))
# 執行結果

******************** op1 ********************
[[[[ 0.78366613]
   [-0.11703026]
   [ 3.533338  ]]

  [[ 3.4455981 ]
   [-2.40102   ]
   [-1.3336506 ]]

  [[ 1.9816184 ]
   [-3.3166158 ]
   [ 2.0968733 ]]]]
******************** op2 ********************
[[[[-4.429776  ]
   [ 4.1218996 ]
   [-4.1383405 ]]

  [[ 0.4804101 ]
   [ 1.3983132 ]
   [ 1.2663789 ]]

  [[-1.8450742 ]
   [-0.02915052]
   [-0.5696235 ]]]]
******************** op3 ********************
[[[[-6.969367]]]]
******************** op4 ********************
[[[[ -2.9217496 ]
   [  4.4683943 ]
   [  7.5761824 ]]

  [[-14.627491  ]
   [ -5.014709  ]
   [ -3.4593797 ]]

  [[  0.45091882]
   [  4.8827124 ]
   [ -9.658895  ]]]]
******************** op5 ********************
[[[[-2.8486536 ]
   [ 1.3990458 ]
   [ 2.953944  ]
   [-6.007198  ]
   [ 5.089696  ]]

  [[-0.20283715]
   [ 2.4726171 ]
   [ 6.2137847 ]
   [-0.38609552]
   [-1.8869443 ]]

  [[ 7.7240233 ]
   [10.6962805 ]
   [-3.1667676 ]
   [-3.6487846 ]
   [-2.2908094 ]]

  [[-9.00223   ]
   [ 4.5111785 ]
   [ 2.5615098 ]
   [-5.8492236 ]
   [ 1.7734764 ]]

  [[ 2.3674765 ]
   [-5.9122458 ]
   [ 5.867611  ]
   [-0.50353   ]
   [-4.890904  ]]]]
******************** op6 ********************
[[[[-4.06957626e+00  5.69651246e-01  2.97890633e-01 -5.08075190e+00
     2.76357365e+00 -7.34121323e+00 -2.09436584e+00]
   [-9.03515625e+00 -8.96854973e+00 -4.40316677e+00 -3.23745847e+00
    -3.56242275e+00  3.67262197e+00  2.59603453e+00]
   [ 1.25131302e+01  1.30267200e+01  2.25630283e+00  3.31285048e+00
    -1.00396938e+01 -9.06786323e-01 -7.20120049e+00]
   [-3.18641067e-01 -7.66135693e+00  5.02029419e+00 -1.65469778e+00
    -5.53000355e+00 -4.76842117e+00  4.98133230e+00]
   [ 3.68885136e+00  2.54145473e-01 -4.17096436e-01  1.20136106e+00
    -2.29291725e+00  6.98313904e+00  4.92819786e-01]]

  [[ 1.22962761e+01  3.85902214e+00 -2.91524696e+00 -6.89016438e+00
     3.35520816e+00 -1.85112596e+00  5.59113741e+00]
   [ 2.99087334e+00  4.42690086e+00 -3.34755349e+00 -7.41521478e-01
     3.65099478e+00 -2.84761238e+00 -2.74149513e+00]
   [-9.65088654e+00 -4.91817188e+00  3.82093906e+00 -5.72443676e+00
     1.43630829e+01  5.11133957e+00 -1.18163595e+01]
   [ 1.69606721e+00 -1.00837049e+01  9.65112305e+00  3.48559356e+00
     4.71356201e+00 -2.74463081e+00 -5.76961470e+00]
   [-5.11555862e+00  1.06215849e+01  1.97274566e+00 -1.66155469e+00
     5.40411043e+00  1.64753020e+00 -2.25898552e+00]]

  [[ 3.20135975e+00  1.16082029e+01  6.35383892e+00 -1.22541785e+00
    -7.81781197e-01 -7.39507914e+00  3.02070093e+00]
   [ 3.37887239e+00 -3.17085648e+00  8.15050030e+00  9.17820644e+00
    -5.42563820e+00 -1.06148596e+01  1.44039564e+01]
   [ 6.06520414e+00 -6.89214110e-01  1.18828654e+00  6.44250536e+00
    -3.90648508e+00 -7.45609093e+00  1.70780718e-02]
   [-5.51369572e+00 -5.99862814e-01 -5.97459745e+00  5.03705800e-01
    -4.89957094e-01  4.65023327e+00  6.97832489e+00]
   [ 5.56566572e+00  3.15251064e+00  4.23309374e+00  4.58887959e+00
     1.11150384e+00  1.56815052e-01 -2.64446616e+00]]

  [[-3.47755957e+00 -2.51347685e+00  5.07092476e+00 -1.79448032e+01
     1.23025656e+00 -7.04272604e+00 -3.11969209e+00]
   [-3.64519453e+00 -2.48672795e+00  1.45192409e+00 -7.42938709e+00
     7.32508659e-01  1.73417020e+00 -8.84127915e-01]
   [ 4.80518007e+00 -1.00521259e+01 -1.47410703e+00 -2.73861027e+00
    -6.11766815e+00  5.89801645e+00  7.41809845e+00]
   [ 1.52897854e+01  3.40052223e+00 -1.17849231e-01  8.11421871e+00
    -7.15329647e-02 -8.57025623e+00 -6.36894524e-01]
   [-1.29184561e+01 -2.07097292e+00  6.51137114e+00  4.45195580e+00
     6.51636696e+00  1.94592953e-01  7.76367307e-01]]

  [[-7.64904690e+00 -4.64357853e+00 -5.09730625e+00  1.46977997e+00
    -2.66898251e+00  6.18280554e+00  7.30443239e+00]
   [ 3.74768376e-02  8.19200230e+00 -2.99126768e+00 -1.25706446e+00
     2.82602859e+00  4.79209185e-01 -7.99170971e+00]
   [-9.31276321e+00  2.71563363e+00  2.68426132e+00 -2.98767281e+00
     2.85978794e-01  5.26730251e+00 -6.51313114e+00]
   [-5.16205406e+00 -3.73660684e+00 -1.25655127e+00 -4.03212357e+00
    -2.34876966e+00  3.49581933e+00  3.21578264e-01]
   [ 4.80592680e+00 -2.01916337e+00 -2.70319057e+00  9.14705086e+00
     3.14293051e+00 -5.12257957e+00  1.87513745e+00]]]]
******************** op7 ********************
[[[[ -5.3398733    4.176247    -1.0400615    1.7490227   -2.3762708
     -4.43866     -2.9152555 ]
   [ -6.2849035    2.9156108    2.2420614    3.0133455    2.697643
     -1.2664369    2.2018924 ]
   [ -1.7367094   -2.6707978   -4.823809    -2.9799473   -2.588249
     -0.8573512    0.7243177 ]]

  [[  9.770168    -6.0919194   -7.755929     0.7116828    4.696847
     -1.5403405  -10.603018  ]
   [ -2.2849545    7.23973      0.06859291  -0.3011052   -7.885673
     -4.7223825   -1.2202084 ]
   [ -1.7584102   -0.9349402    1.8078477    6.8720684   11.548839
     -1.3058915    1.785974  ]]

  [[  3.8749192   -5.9033284    1.3921509   -2.68101      5.386052
      5.2535496    7.804141  ]
   [  1.9598813   -6.1589165    0.9447456    0.06089067  -3.7891803
     -2.0653834   -2.60965   ]
   [ -2.1243367   -0.9703847    1.5366316    5.8760977   -3.697129
      6.050654    -0.01914603]]]]
******************** op8 ****************
            
           

相關推薦

TensorFlow理解tf.nn.conv2d方法 ( 程式碼註釋 )

最近在研究學習TensorFlow,在做識別手寫數字的demo時,遇到了tf.nn.conv2d這個方法,查閱了官網的API 發現講得比較簡略,還是沒理解。google了一下,參考了網上一些朋友寫得部落格,結合自己的理解,差不多整明白了。 方法定義 tf.nn.

TensorFlow函式之tf.nn.conv2d()(程式碼

tf.nn.conv2d是TensorFlow裡面實現卷積的函式,是搭建卷積神經網路比較核心的一個方法。 函式格式: tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu =  Noen, name = Non

TensorFlow關於tf.nn.sparse_softmax_cross_entropy_with_logits()

tf.nn.sparse_softmax_cross_entropy_with_logits()這是一個TensorFlow中經常需要用到的函式。官方文件裡面有對它詳細的說明,傳入的logits為神經網路輸出層的輸出,shape為[batch_size,num_classes

TensorFlow理解 Estimators 和 Datasets

Estimators 和 Datasets Datasets:建立一個輸入管道(input pipelines)來為你的模型讀取資料,在這個 pipelines 中你可以做一些資料預處理,儘量都使用 TensorFlow 自己的函式,即 tf 開頭的函式(

tensorflow學習:tf.nn.conv2dtf.layers.conv2d

看了很多tensorflow卷積的例子,有的用了tf.nn.conv2d,有的用了tf.layers.conv2d,那麼這兩個究竟有啥不同呢? tf.layers.conv2d(inputs, fi

怎麼理解tf.nn,conv2d(卷積神經網路)的影象通道數

其實"影象通道數"就是影象的xx,呵呵..,其實這裡的影象通道數其實是叫做“影象的色彩通道數”,還是來看例子理解吧! 如每一張圖片的大小為28*28*1,則表示圖片的大小為28*28的畫素,*1表示是黑白的,即為一個色彩通道 同理,28*28*3,則表示圖片的大小為28*2

TensorFlowNumpy常用函式彙總(原始碼)

以下內容是我在學習Numpy時,寫的例項,每一個模組都可以執行,並比較不同函式之間的差別。import numpy as np#dtype 定義numpy的儲存型別(np.int np.float),預設是64'''#定義矩陣格式'''

spring-boot實戰08:Spring Boot屬性配置文件

命令行 可見 str ear isp active 文件加載 junit4 實驗 相信很多人選擇Spring Boot主要是考慮到它既能兼顧Spring的強大功能,還能實現快速開發的便捷。我們在Spring Boot使用過程中,最直觀的感受就是沒有了原來自己整合Spring

Linux系統編程---dup和dup2

系統 強調 操作 attach bsp ads 正常的 註意 tdi 正常的文件描述符: 在linux下,通過open打開以文件後,會返回一個文件描述符,文件描述符會指向一個文件表,文件表中的節點指針會指向節點表。看下圖: 打開文件的內核數據結構 dup和dup2兩

C#各個版本中的新增特性

members 托管 分隔符 main 數據 logs ttr dot 提高 轉自:http://www.cnblogs.com/knowledgesea/p/6694979.html 序言 自從2000年初期發布以來,c#編程語言不斷的得到改進,使我們能夠更加清晰的編

android開發學習 ------- android中的單例模式 (

lan post tail -- and 使用 href details android開發 https://blog.csdn.net/u011418943/article/details/60139644 這篇文章 前因後果 都說出來了 ,值得學習。 htt

python time模塊和datetime模塊

-a cond .com ima 封裝 基本 sta times %d 一、time模塊 time模塊中時間表現的格式主要有三種:   a、timestamp時間戳,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量   b、struct_time時間

JDK的Parser來解析Java原始碼

轉自:https://www.jb51.net/article/92989.htm 這篇文章主要介紹了JDK的Parser來解析Java原始碼的相關資料,需要的朋友可以參考下 在JDK中,自帶了一套相關的編譯API,可以在Java中發起編譯流程,解析Java原始檔然後獲取其語法樹,在JDK的

OpenCV3透視變換——cv::getPerspectiveTransform()與cv::warpPerspective()

透視變換(Perspective Transformation)是將成像投影到一個新的視平面(Viewing Plane),也稱作投影對映(Projective Mapping)。如圖1,通過透視變換ABC變換到A'B'C'。 圖1 透視變換示意圖

linuxlinux命令:fdisk -l 顯示資訊

目錄 一、fdisk -l  二、磁碟計算公式 三、參考博文 一、fdisk -l  fdisk -l (1)Disk /dev/vda: 107.4 GB, 107374182400 bytes, 209715200 sectors

Pythonpandas軸旋轉stack和unstack用法

摘要 前面給大家分享了pandas做資料合併的兩篇[pandas.merge]和[pandas.cancat]的用法。今天這篇主要講的是pandas的DataFrame的軸旋轉操作,stack和unstack的用法。 首先,要知道以下五點: 1.stack:將資料的列“旋轉”為行 2

Python3使用Django2.x的settings檔案

  # -*- coding:utf8 -*- import os # 專案路徑 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 安全金鑰,預設隨機加密字串 SECRET_KE

知識UML類圖與類的關係

在畫類圖的時候,理清類和類之間的關係是重點。類的關係有泛化(Generalization)、實現(Realization)、依賴(Dependency)和關聯(Association)。其中關聯又分為一般關聯關係和聚合關係(Aggregation),合成關係(Composition)。下面我們結合例項理解這

VirtualBox與VMware中的網路模式

VirtualBox中有4中網路連線方式: NAT Bridged Adapter Internal Host-only Adapter VMWare中有三種,其實他跟VMWare 的網路連線方式都是一樣概念,只是比VMWare多了Internal方式。

Boostboost庫中thread多執行緒5——談談執行緒中斷

執行緒不是在任意時刻都可以被中斷的。如果將執行緒中函式中的sleep()睡眠等待去掉,那麼即使在主執行緒中呼叫interrupt()執行緒也不會被中斷。 thread庫預定義了若干個執行緒的中斷點,只有當執行緒執行到中斷點的時候才能被中斷,一個執行緒可以擁有任意多箇中斷點。