1. 程式人生 > >在定義卷積時為什麼要對其中一個函式進行翻轉

在定義卷積時為什麼要對其中一個函式進行翻轉

在卷積的定義中為什麼函式g(τ)要先翻轉為g(-τ)再平移為g(x-τ)而不是直接記作g(τ-x)這樣做有什麼好處麼?

我知道問一個概念的定義就好像問"媽媽"為什麼要叫"媽媽"一樣。但我始終覺得這樣的定義有些彆扭。想知道這樣做背後的意義。

不要試圖直接從公式上去思考"翻轉"的意義,回到問題的起源,你就會豁然開朗了。

打個比方,往平靜的水面裡面扔石頭。我們把水面的反應看作是一種衝擊響應。水面在t=0時刻石頭丟進去的時候會激起高度為h(0)的波紋,但水面不會立馬歸於平靜,隨著時間的流逝,波紋幅度會越來越小,在t=1時刻,幅度衰減為h(1), 在t=2時刻,幅度衰減為h(2)……直到一段時間後,水面重複歸於平靜。

從時間軸上來看,我們只在t=0時刻丟了一塊石頭,其它時刻並沒有做任何事,但在t=1,2….時刻,水面是不平靜的,這是因為過去(t=0時刻)的作用一直持續到了現在。

那麼,問題來了:

如果我們在t=1時刻也丟入一塊石子呢?此時t=0時刻的影響還沒有消失(水面還沒有恢復平靜)新的石子又丟進來了,那麼現在激起的波浪有多高呢?答案是當前激起的波浪與t=0時刻殘餘的影響的疊加。那麼t=0時刻對t=1時刻的殘餘影響有多大呢?

為了便於說明,接下來我們作一下兩個假設:

1. 水面對於"單位石塊"的響應是固定的

2. 丟一個兩倍於的"單位石塊"的石塊激起的波紋高度是丟一個石塊的兩倍(即系統滿足線性疊加原理)

現在我們來計算每一時刻的波浪有多高:

  • t=0時刻:

y(0)=x(0)*h(0);

  • t=1時刻:

當前石塊引起的影響x(1)*h(0);

t=0時刻石塊x(0)引起的殘餘影響x(0)*h(1);

y(1)=x(1)*h(0)+ x(0)*h(1);

  • t=2時刻:

當前石塊引起的影響x(2)*h(0);

t=0時刻石塊x(0)引起的殘餘影響x(0)*h(2);

t=1時刻石塊x(1)引起的殘餘影響x(1)*h(1);

y(2)=x(2)*h(0)+ x(1)*h(1)+x(0)*h(2);

……

  • t=N時刻:

當前石塊引起的影響x(N)*h(0);

t=0時刻石塊x(0)引起的殘餘影響x(0)*h(N);

t=1時刻石塊x(1)引起的殘餘影響x(1)*h(N-1);

y(N)=x(N)*h(0)+ x(N-1)*h(1)+x(N-2)*h(2)+…+x(0)*h(N);

這就是離散卷積的公式了

理解了上面的問題,下面我們來看看"翻轉"是怎麼回事:

當我們每次要丟石子時,站在當前的時間點,系統的對我們的迴應都是h(0),時間軸之後的(h(1),h(2).....)都是對未來的影響。而整體的迴應要加上過去對於現在的殘餘影響。

現在我們來觀察t=4這個時刻。

站在t=0時刻看他對於未來(t=4)時刻(從現在往後4秒)的影響,可見是x(0)*h(4)

站在t=1時刻看他對於未來(t=4)時刻的影響(從現在往後3秒),可見是x(1)*h(3)

站在t=2時刻看他對於未來(t=4)時刻的影響(從現在往後2秒),可見是x(2)*h(2)

站在t=3時刻看他對於未來(t=4)時刻的影響(從現在往後1秒),可見是x(3)*h(1)

所以所謂的翻轉只是因為你站立的現在是過去的未來,而因為h(t)始終不變,故h(1)其實是前一秒的h(1),而前一秒的h(1)就是現在,所以從當前x(4)的角度往左看,你看到的是過去的作用。h(t)未翻轉前,當從h(0)往右看,你看到的是現在對於未來的影響,當翻轉h(t)之後,從h(0)往左看,你依次看到的越來越遠的過去對現在的影響,而這個影響,與從x=4向左看的作用影響相對應(都是越來越遠的過去),作用與作用的響應就對應起來了,這一切的本質,是因為你站立的時間觀察點和方向在變。

相關推薦

定義為什麼其中一個函式進行翻轉

在卷積的定義中為什麼函式g(τ)要先翻轉為g(-τ)再平移為g(x-τ)而不是直接記作g(τ-x)這樣做有什麼好處麼? 我知道問一個概念的定義就好像問"媽媽"為什麼要叫"媽媽"一樣。但我始終覺得這樣的定義有些彆扭。想知道這樣做背後的意義。 不要試圖直接從公式上去思考"翻轉"的意義,回到問題的起源,你就會豁然開

Tensorflow學習教程------利用神經網路mnist資料集進行分類_利用訓練好的模型進行分類

#coding:utf-8 import tensorflow as tf from PIL import Image,ImageFilter from tensorflow.examples.tutorials.mnist import input_data def imageprepare(ar

Opencv3 Robert算子 Sobel算子 拉普拉斯算子 自定義核——實現漸進模糊

ima png har [] int turn src stream esp #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace c

pytorch 自定義進行操作

一 卷積操作:在pytorch搭建起網路時,大家通常都使用已有的框架進行訓練,在網路中使用最多就是卷積操作,最熟悉不過的就是 torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation

deeplearning4j——神經網路驗證碼進行識別

一、前言     計算機視覺長久以來沒有大的突破,卷積神經網路的出現,給這一領域帶來了突破,本篇部落格,將通過具體的例項來看看卷積神經網路在影象識別上的應用。     導讀     1、問題描述   &n

deeplearning4j——神經網絡驗證碼進行識別

www. 內部 采樣 視覺 inf rain agen ol3 mas   一、前言    計算機視覺長久以來沒有大的突破,卷積神經網絡的出現,給這一領域帶來了突破,本篇博客,將通過具體的實例來看看卷積神經網絡在圖像識別上的應用。    導讀    1、問題描述    2、

定義資料表考慮的要素

定義資料表時要考慮的要素 建立一張資料表時一般有以下要素要考慮: 列: 欄位型別 是否為空 是否自增 預設值 鍵: 主鍵 外來鍵 唯一鍵(也可能是多個 filed 組成的) 觸發器(就是自動呼叫的儲存過程

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

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

java:集合框架練習-從鍵盤接收一個字串, 程式其中所有字元進行排序

import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class Test5

神經網路CIFAR資料集分類

本例通過一個具有全域性平局池化層的神經網路對CIFAR資料集分類 1.匯入標頭檔案引入資料集 這部分使用cifar10_input裡面的程式碼,在cifar10資料夾下建立卷積檔案,部分程式碼如下: import cifar10_input import tensorf

Effective C++(12) 複製物件複製每一個成員

問題聚焦: 負責拷貝的兩個操作:拷貝建構函式和過載賦值操作符。 一句話總結,確保被拷貝物件的所有成員變數都做一份拷貝。 Demo void logCall(const std::string& funcName); // log函式 class D

論文閱讀-為什麼深度神經網路小目標的變換泛化效果很差?

論文地址: Why do deep convolutional networks generalize so poorly to small image transformations? 1. 摘要   該論文發現,現代深度卷積神經網路在影象中的小目標發生平移後對其類別的判斷會產

MATLAB做矩陣 域做,頻域相乘 (頻乘) 二維

function out = SJPC(A,B) % 時卷頻乘,可用於求矩陣卷積 [ra,ca] = size(A); [rb,cb] = size(B); r = ra+rb-1; % A,B兩個矩陣做卷積後其行數和列數分別為A,B矩陣的行列數相加減1 c = ca+c

ANSYS workbench單獨一個body進行後處理的方法

shadow 區分 方法 com 顏色 body 點擊 vpd 尺度 最近在做一個結構應力分析,在後處理的時候遇到了總體尺度太大,看某一零件的雲圖沒有區分度(全是同一顏色)的問題,百度得到了解決方法。 首先點擊上方選中 body/element 選中功能,

利用C#開發web應用程式登錄檔進行操作提示沒有許可權的解決辦法

因為公司專案需要對web程式新增一套限制客戶惡意傳播的方案。沒辦法,東西放在客戶的伺服器或者電腦裡面。鑑於本人菜鳥一個,也就能想到利用兩種方案,具體的實現的方式,將會在之後的博文中寫出。 我寫這篇文章

影象語義分割(5)-DeepLabV2: 使用深度網路、空洞和全連線條件隨機場進行影象語義分割

論文地址 :DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs 論文程式碼:工程連結 1. 簡介   Dee

當eChart的Y軸必須是整數原echarts_common.js進行補充

//新增欄位isLength,用來判斷是否進入整數判斷,如果Y軸必須要整數的話,設定為true function setCharts(charts,options,isLength) {var  myChart = echarts.init(document.getElementById(charts),'s

在ListView中動態新增EditText並其中的資料進行儲存和由於複用引起的Editext中的內容顯示異常的解決方案

public class AddAdapter extends BaseAdapter { private Context context; //需要增加的條目用一個Map儲存 private Map edItem; //記錄增加的條目數,作為下標給deItem賦值,可以不要

微信小程式wx.request函式進行封裝操作的程式碼示例

//app.js App({ onLaunch: function () { }, networkEngine: require('utils/network.js') })// /utils/network.js module.exports ={

C語言之定義一個函式,實現字串做如下操作:當字元為字母,大小寫互換,當字元為數字,原樣輸出,當有其它字元出現時,結束操作,返回已處理的字串

Action(){       char str[]={"tEst234%^road"};int len = sizeof(str)/sizeof(char);//strTest2呼叫函式lr_output_message("%s",strTest2(str,len)); r