捲積運算,兩個輸入張量(輸入數據和捲積核)進行捲積,輸出代表來自每個輸入的信息張量。tf.nn.conv2d完成捲積運算。捲積核(kernel),權值、濾波器、捲積矩陣或模版,filter。權值訓練習得。捲積核(filter參數)權值數量決定需要學習捲積核數量。通道,電腦器視覺,描述輸出向量。RG ...
捲積運算,兩個輸入張量(輸入數據和捲積核)進行捲積,輸出代表來自每個輸入的信息張量。tf.nn.conv2d完成捲積運算。捲積核(kernel),權值、濾波器、捲積矩陣或模版,filter。權值訓練習得。捲積核(filter參數)權值數量決定需要學習捲積核數量。通道,電腦器視覺,描述輸出向量。RGB圖像,3個代表秩1張量[red,green,blue]通道。輸出與input_batch同秩張量,與捲積核維數相同。兩個張量捲積生成特征圖(feature map)。特征圖為輸出添加新層代表張量捲積。訪問輸入批數據和特征圖元素用相同索引,可瞭解輸入與kernel捲積運算值變化。層,輸出新維度。
電腦視覺捲積價值,修改捲積核strides(跨度)參數實現輸入降維。strides參數使捲積核無需遍歷每個輸入元素,跳過部分圖像像素。kernel在input_batch滑動,跨過部分元素,每次移動以input_batch一個元素為中心。位置重疊值相乘,乘積相加,得捲積結果。逐點相乘,整合兩個輸入。設置跨度,調整輸入張量維數。降維減少運算量,避免重疊感受域。strides參數格式與輸入向量相同(image_batch_size_stride、image_height_stride、image_width_stride、image_channels_stride)。
邊界填充,捲積核與圖像尺寸不匹配,填充圖像缺失區域。TensorFlow用0填充。padding參數控制conv2d零填充數或錯誤狀態。SAME:捲積輸出輸入尺寸相同,不考慮濾波器尺寸,缺失像素填充0,捲積核掃像素數大於圖像實際像素數。VALID:考慮濾波器尺寸。儘量不越過圖像邊界,也可能邊界被填充。
data_format修改數據格式。NHWC指定輸入輸出數據格式,[batch_size(批數據張量數)、in_height(批數據張量高度)、in_width(批數據張量寬度)、in_channels(批數據張量通道數)]。NCHW指定輸入輸出數據格式,[batch_size、in_channels、in_height、in_width]。
TensorFlow濾波器參數指定輸入捲積運算捲積核。濾波器使用特定模式突出圖像中感興趣特征。圖像與邊緣檢測捲積核的捲積輸出是所有檢測邊緣區域。tf.minimum和tf.nn.relu使捲積值保持在RGB顏色值合法範圍[0,255]內。捲積核初值隨機設定,訓練迭代,值由CNN學習層自動調整,訓練一迭代,接收圖像,與捲積核捲積,預測結果與圖像真實標簽是否一致,調整捲積核。
import tensorflow as tf input_batch = tf.constant([ [#第1個輸入 [[0.0],[1.0]], [[2.0],[3.0]] ], [#第2個輸入 [[2.0],[4.0]], [[6.0],[8.0]] ] ]) print input_batch kernel = tf.constant([ [ [[1.0, 2.0]] ] ]) print kernel conv2d = tf.nn.conv2d(input_batch, kernel, strides=[1, 1, 1, 1], padding='SAME')#conv2d捲積運算 print conv2d sess = tf.Session() print sess.run(conv2d) lower_right_image_pixel = sess.run(input_batch)[0][1][1] lower_right_kernel_pixel = sess.run(conv2d)[0][1][1] print lower_right_image_pixel, lower_right_kernel_pixel input_batch2 = tf.constant([ [#第1個輸入(6x6x1) [[0.0],[1.0],[2.0],[3.0],[4.0],[5.0]], [[0.1],[1.1],[2.1],[3.1],[4.1],[5.1]], [[0.2],[1.2],[2.2],[3.2],[4.2],[5.2]], [[0.3],[1.3],[2.3],[3.3],[4.3],[5.3]], [[0.4],[1.4],[2.4],[3.4],[4.4],[5.4]], [[0.5],[1.5],[2.5],[3.5],[4.5],[5.5]] ] ]) print input_batch2 kernel2 = tf.constant([#捲積核(3x3x1) [[[0.0]], [[0.5]], [[0.0]]], [[[0.0]], [[1.0]], [[0.0]]], [[[0.0]], [[0.5]], [[0.0]]] ]) print kernel2 conv2d2 = tf.nn.conv2d(input_batch2, kernel2, strides=[1, 3, 3, 1], padding='SAME') print conv2d2 print sess.run(conv2d2) lower_right_image_pixel2 = sess.run(input_batch2)[0][1][1] lower_right_kernel_pixel2 = sess.run(conv2d2)[0][1][1] print lower_right_image_pixel2, lower_right_kernel_pixel2 input_batch3 = tf.constant([ [#第1個輸入(6x6x1) [[0.0,1.0,2.0],[1.0,2.0,3.0]], [[0.1,1.1,2.1],[1.1,2.1,3.1]], [[0.2,1.2,2.2],[1.2,2.2,3.2]], [[0.3,1.3,2.3],[1.3,2.3,3.3]], [[0.4,1.4,2.4],[1.4,2.4,3.4]], [[0.5,1.5,2.5],[1.5,2.5,3.5]] ] ]) print input_batch3 kernel3 = tf.constant([ [ [[-1., 0., 0.],[0., -1., 0.],[0., 0., -1.]], [[-1., 0., 0.],[0., -1., 0.],[0., 0., -1.]], [[-1., 0., 0.],[0., -1., 0.],[0., 0., -1.]] ], [ [[-1., 0., 0.],[0., -1., 0.],[0., 0., -1.]], [[8., 0., 0.],[0., 8., 0.],[0., 0., 8.]], [[-1., 0., 0.],[0., -1., 0.],[0., 0., -1.]] ], [ [[-1., 0., 0.],[0., -1., 0.],[0., 0., -1.]], [[-1., 0., 0.],[0., -1., 0.],[0., 0., -1.]], [[-1., 0., 0.],[0., -1., 0.],[0., 0., -1.]] ] ]) print kernel3 conv2d3 = tf.nn.conv2d(input_batch3, kernel3, strides=[1, 1, 1, 1], padding='SAME') print conv2d3 activation_map3 = sess.run(tf.minimum(tf.nn.relu(conv2d3), 255)) print activation_map3 lower_right_image_pixel3 = sess.run(input_batch3)[0][1][1] lower_right_kernel_pixel3 = sess.run(conv2d3)[0][1][1] print lower_right_image_pixel3, lower_right_kernel_pixel3 kernel4 = tf.constant([ [ [[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]], [[-1., 0., 0.],[0., -1., 0.],[0., 0., -1.]], [[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]] ], [ [[-1., 0., 0.],[0., -1., 0.],[0., 0., -1.]], [[5., 0., 0.],[0., 5., 0.],[0., 0., 5.]], [[-1., 0., 0.],[0., -1., 0.],[0., 0., -1.]] ], [ [[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]], [[-1., 0., 0.],[0., -1., 0.],[0., 0., -1.]], [[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]] ] ]) print kernel4 conv2d4 = tf.nn.conv2d(input_batch3, kernel4, strides=[1, 1, 1, 1], padding='SAME') print conv2d4 activation_map4 = sess.run(tf.minimum(tf.nn.relu(conv2d4), 255)) print activation_map4 lower_right_image_pixel4 = sess.run(input_batch3)[0][1][1] lower_right_kernel_pixel4 = sess.run(conv2d4)[0][1][1] print lower_right_image_pixel4, lower_right_kernel_pixel4
參考資料:
《面向機器智能的TensorFlow實踐》
歡迎加我微信交流:qingxingfengzi
我的微信公眾號:qingxingfengzigz
我老婆張幸清的微信公眾號:qingqingfeifangz