Apa itu lapisan dekonvolusional?


188

Saya baru-baru ini membaca Jaringan Konvolusional Sepenuhnya untuk Segmentasi Semantik oleh Jonathan Long, Evan Shelhamer, Trevor Darrell. Saya tidak mengerti apa yang dilakukan "lapisan dekonvolusional" / cara kerjanya.

Bagian yang relevan adalah

3.3. Upsampling adalah belokan terbalik ke belakang

Cara lain untuk menghubungkan output kasar ke piksel padat adalah interpolasi. Misalnya, sederhana interpolasi bilinear menghitung setiap output dari empat input terdekat dengan peta linear yang hanya bergantung pada posisi relatif dari sel input dan output. Dalam arti tertentu, upampling dengan faktor f berbelit-belit dengan langkah input fraksional 1 / f. Selama f merupakan bagian integral, maka cara alami untuk melakukan upample adalah konvolusi mundur (kadang-kadang disebut dekonvolusi) dengan langkah keluaran f . Operasi semacam itu sepele untuk dilaksanakan, karena hanya membalikkan lintasan ke depan dan ke belakang dari belokan.yij
fff
Dengan demikian upampling dilakukan dalam jaringan untuk pembelajaran ujung ke ujung dengan backpropagation dari hilangnya pixelwise.
Perhatikan bahwa filter dekonvolusi pada lapisan seperti itu tidak perlu diperbaiki (misalnya, untuk bilinear upampling), tetapi dapat dipelajari. Tumpukan lapisan dekonvolusi dan fungsi aktivasi bahkan dapat mempelajari upliner nonlinear.
Dalam percobaan kami, kami menemukan bahwa upampling dalam jaringan cepat dan efektif untuk mempelajari prediksi yang padat. Arsitektur segmentasi terbaik kami menggunakan lapisan-lapisan ini untuk mempelajari upample untuk prediksi yang lebih baik di Bagian 4.2.

Saya tidak berpikir saya benar-benar mengerti bagaimana lapisan convolutional dilatih.

Apa yang saya pikir saya mengerti adalah bahwa lapisan konvolusional dengan ukuran kernel belajar filter dengan ukuran k × k . Output dari lapisan konvolusional dengan ukuran kernel k , filter s N dan n berukuran dimensi Dim redupkk×kksNn. Namun, saya tidak tahu bagaimana cara kerja lapisan konvolusional. (Saya mengerti bagaimana MLP sederhana belajar dengan gradient descent, jika itu membantu).Input dims2n

Jadi, jika pemahaman saya tentang lapisan konvolusional benar, saya tidak tahu bagaimana ini dapat dibalik.

Adakah yang bisa membantu saya memahami lapisan dekonvolusional?


3
Video ceramah ini menjelaskan tentang dekonvolusi / upampling
user199309

6
Berharap itu bisa bermanfaat bagi siapa pun, saya membuat buku catatan untuk mengeksplorasi bagaimana konvolusi dan konvolusi yang dialihkan dapat digunakan dalam TensorFlow (0,11). Mungkin memiliki beberapa contoh dan angka praktis dapat membantu sedikit lebih untuk memahami cara kerjanya.
AkiRoss

1
Bagi saya, halaman ini memberi saya penjelasan yang lebih baik dan juga menjelaskan perbedaan antara dekonvolusi dan konvolusi transpose: menujudatascience.com/...
T.Antoni

Bukankah upampling lebih seperti pooling mundur daripada konvolusi melangkah mundur, karena tidak memiliki parameter?
Ken Fehling

Catatan: Nama "lapisan dekonvolusional" menyesatkan karena lapisan ini tidak melakukan dekonvolusi .
user76284

Jawaban:


210

Lapisan dekonvolusi adalah nama yang sangat disayangkan dan lebih baik disebut lapisan konvolusional transpos .

Secara visual, untuk konvolusi yang dialihkan dengan langkah satu dan tanpa pelapis, kami hanya mengisi input asli (entri biru) dengan nol (entri putih) (Gambar 1).

Gambar 1

Dalam hal langkah kedua dan padding, konvolusi yang berubah akan terlihat seperti ini (Gambar 2):

Gambar 2

Anda dapat menemukan lebih banyak visualisasi aritmatika konvolusional (hebat) di sini .


16
Hanya untuk memastikan saya memahaminya: "Dekonvolusi" hampir sama dengan konvolusi, tetapi Anda menambahkan beberapa padding? (Sekitar gambar / kapan s> 1 juga di sekitar setiap piksel)?
Martin Thoma

17
Ya, lapisan dekonvolusi berkinerja juga konvolusi! Itulah sebabnya konvolusi yang ditransformasikan cocok dengan nama dan istilah dekonvolusi sebenarnya menyesatkan.
David Dao

11
Mengapa Anda mengatakan "no padding" pada Gambar 1, jika input sebenarnya adalah zero-padded?
Stas S

8
Ngomong-ngomong: Ini disebut konvolusi tergeser sekarang di TensorFlow: tensorflow.org/versions/r0.10/api_docs/python/…
Martin Thoma

9
Terima kasih atas jawaban yang sangat intuitif ini, tetapi saya bingung mengapa yang kedua adalah kasus 'langkah kedua', ini berperilaku persis seperti yang pertama ketika kernel bergerak.
Pertunjukan

49

Saya pikir salah satu cara untuk mendapatkan intuisi tingkat yang benar-benar dasar di balik konvolusi adalah bahwa Anda menggeser filter K, yang dapat Anda anggap sebagai stensil K, pada gambar input dan menghasilkan aktivasi K - masing-masing mewakili tingkat kecocokan dengan stensil tertentu . Operasi terbalik dari itu adalah untuk mengambil aktivasi K dan memperluasnya menjadi preimage operasi konvolusi. Penjelasan intuitif dari operasi terbalik karena itu, kira-kira, rekonstruksi gambar diberikan stensil (filter) dan aktivasi (tingkat kecocokan untuk setiap stensil) dan oleh karena itu pada tingkat intuitif dasar kami ingin meledakkan setiap aktivasi oleh topeng stensil dan menambahkannya.

Cara lain untuk mendekati pemahaman dekon adalah dengan memeriksa implementasi lapisan dekonvolusi dalam Caffe, lihat bit kode yang relevan berikut ini:

DeconvolutionLayer<Dtype>::Forward_gpu
ConvolutionLayer<Dtype>::Backward_gpu
CuDNNConvolutionLayer<Dtype>::Backward_gpu
BaseConvolutionLayer<Dtype>::backward_cpu_gemm

Anda dapat melihat bahwa itu diterapkan di Caffe persis seperti backprop untuk lapisan konvolusional maju biasa (bagi saya itu lebih jelas setelah saya membandingkan implementasi backprop di lapisan cuDNN vs ConvolutionLayer :: Backward_gpu diimplementasikan menggunakan GEMM). Jadi, jika Anda mempelajari cara melakukan backpropagation untuk konvolusi reguler, Anda akan memahami apa yang terjadi pada tingkat perhitungan mekanis. Cara penghitungan ini cocok dengan intuisi yang dijelaskan dalam paragraf pertama uraian singkat ini.

Namun, saya tidak tahu bagaimana cara kerja lapisan konvolusional. (Saya mengerti bagaimana MLP sederhana belajar dengan gradient descent, jika itu membantu).

Untuk menjawab pertanyaan Anda yang lain di dalam pertanyaan pertama Anda, ada dua perbedaan utama antara backpropagation MLP (lapisan yang terhubung penuh) dan jaring konvolusional:

1) pengaruh bobot dilokalisasi, jadi pertama-tama cari tahu bagaimana melakukan backprop untuk, katakanlah filter 3x3 yang dihubungkan dengan area kecil 3x3 dari gambar input, pemetaan ke satu titik di gambar hasil.

2) bobot filter konvolusional dibagi untuk invarian spasial. Apa artinya ini dalam praktiknya adalah bahwa dalam penyaluran ke depan filter 3x3 yang sama dengan bobot yang sama diseret ke seluruh gambar dengan bobot yang sama untuk perhitungan penerusan untuk menghasilkan gambar output (untuk filter tertentu). Apa artinya ini untuk backprop adalah bahwa gradien backprop untuk setiap titik dalam gambar sumber dijumlahkan di seluruh rentang yang kami seret filter itu selama meneruskan. Perhatikan bahwa ada juga perbedaan gradien loss wrt x, w dan bias karena dLoss / dx perlu di-backpropagated, dan dLoss / dw adalah cara kami memperbarui bobot. w dan bias adalah input independen dalam DAG perhitungan (tidak ada input sebelumnya), jadi tidak perlu melakukan backpropagation pada mereka.

(my notation here assumes that convolution is y = x*w+b where '*' is the convolution operation)

7
Saya pikir ini adalah jawaban terbaik untuk pertanyaan ini.
kli_nlpr

8
Saya setuju bahwa ini adalah jawaban terbaik. Jawaban teratas memiliki animasi yang indah, tetapi sampai saya membaca jawaban ini, mereka hanya tampak seperti konvolusi biasa dengan padding sewenang-wenang kepada saya. Oh, betapa orang-orang terombang-ambing oleh permen mata.
Reii Nakano

1
Setuju, jawaban yang diterima tidak menjelaskan apa pun. Ini jauh lebih baik.
BjornW

Terima kasih atas penjelasan Anda yang luar biasa. Saat ini saya tidak tahu bagaimana melakukan backprop dengan benar. Bisakah Anda memberi saya petunjuk tentang hal itu?
Bastian

33

Matematika langkah demi langkah menjelaskan bagaimana transpose convolution 2x upampling dengan filter 3x3 dan langkah 2:

masukkan deskripsi gambar di sini

Cuplikan TensorFlow paling sederhana untuk memvalidasi matematika:

import tensorflow as tf
import numpy as np

def test_conv2d_transpose():
    # input batch shape = (1, 2, 2, 1) -> (batch_size, height, width, channels) - 2x2x1 image in batch of 1
    x = tf.constant(np.array([[
        [[1], [2]], 
        [[3], [4]]
    ]]), tf.float32)

    # shape = (3, 3, 1, 1) -> (height, width, input_channels, output_channels) - 3x3x1 filter
    f = tf.constant(np.array([
        [[[1]], [[1]], [[1]]], 
        [[[1]], [[1]], [[1]]], 
        [[[1]], [[1]], [[1]]]
    ]), tf.float32)

    conv = tf.nn.conv2d_transpose(x, f, output_shape=(1, 4, 4, 1), strides=[1, 2, 2, 1], padding='SAME')

    with tf.Session() as session:
        result = session.run(conv)

    assert (np.array([[
        [[1.0], [1.0],  [3.0], [2.0]],
        [[1.0], [1.0],  [3.0], [2.0]],
        [[4.0], [4.0], [10.0], [6.0]],
        [[3.0], [3.0],  [7.0], [4.0]]]]) == result).all()

Saya pikir perhitungan Anda salah di sini. Output antara harus 3+ 2 * 2 = 7, maka untuk kernel 3x3 output akhir harus 7-3 + 1 = 5x5
Alex

Maaf, @Alex, tapi saya gagal mengerti mengapa output antara adalah 7. Bisakah Anda jelaskan?
andriys

2
@ andriys Pada gambar yang Anda perlihatkan, mengapa hasil akhir terpotong?
James Bond

28

The catatan yang menyertai Stanford CS kelas CS231n : Konvolusional Neural Networks untuk Visual Recognition, dengan Andrej Karpathy , melakukan pekerjaan yang sangat baik menjelaskan jaringan saraf convolutional.

Membaca makalah ini seharusnya memberi Anda gambaran kasar tentang:

  • Jaringan Dekonvolusional Matthew D. Zeiler, Dilip Krishnan, Graham W. Taylor dan Departemen Ilmu Komputer Rob Fergus, Courant Institute, New York University

Ini slide yang besar untuk Deconvolutional Networks.


29
Apakah mungkin untuk meringkas konten dari salah satu tautan tersebut, dalam paragraf pendek? Tautan mungkin berguna untuk penelitian lebih lanjut, tetapi idealnya jawaban pertukaran tumpukan harus memiliki cukup teks untuk menjawab pertanyaan dasar tanpa harus keluar dari situs.
Neil Slater

Saya minta maaf tetapi konten halaman ini terlalu besar untuk diringkas dalam paragraf pendek.
Azrael

12
Ringkasan lengkap tidak diperlukan, hanya judul - mis. "Jaringan saraf dekonvolusional mirip dengan CNN, tetapi dilatih sehingga fitur dalam lapisan tersembunyi dapat digunakan untuk merekonstruksi lapisan sebelumnya (dan dengan pengulangan lintas lapisan, akhirnya input dapat direkonstruksi dari output). Ini memungkinkan untuk dilatih tanpa pengawasan untuk mempelajari fitur tingkat tinggi generik dalam domain masalah - biasanya pemrosesan gambar "(catatan saya bahkan tidak yakin apakah itu benar, maka tidak menulis saya jawaban sendiri).
Neil Slater

6
Meskipun tautannya bagus, ringkasan singkat model dengan kata-kata Anda sendiri akan lebih baik.
SmallChess

11

Baru saja menemukan artikel yang bagus dari situs web theaon tentang topik ini [1]:

Kebutuhan untuk konvolusi yang dialihkan umumnya muncul dari keinginan untuk menggunakan transformasi yang berlawanan dengan konvolusi normal, [...] untuk memproyeksikan peta fitur ke ruang dimensi yang lebih tinggi. [...] yaitu, memetakan dari ruang 4-dimensi ke ruang 16-dimensi, sambil menjaga pola konektivitas konvolusi.

Konvolusi berubah - juga disebut konvolusi fraksional - bekerja dengan menukar lintasan maju dan mundur dari konvolusi. Salah satu cara untuk mengatakannya adalah dengan mencatat bahwa kernel mendefinisikan konvolusi, tetapi apakah itu konvolusi langsung atau konvolusi transpos ditentukan oleh bagaimana lintasan maju dan mundur dihitung.

Operasi konvolusi yang dialihkan dapat dianggap sebagai gradien dari beberapa konvolusi sehubungan dengan inputnya, yang biasanya merupakan cara konvolusi yang dialihkan diimplementasikan dalam praktik.

Akhirnya perhatikan bahwa selalu mungkin untuk mengimplementasikan konvolusi yang berubah dengan konvolusi langsung. Kerugiannya adalah biasanya melibatkan penambahan banyak kolom dan baris nol ke input, sehingga implementasi menjadi jauh lebih efisien.

Jadi dalam simplespeak, "transposed convolution" adalah operasi matematika menggunakan matriks (seperti konvolusi) tetapi lebih efisien daripada operasi konvolusi normal dalam kasus ketika Anda ingin kembali dari nilai-nilai yang dililitkan ke yang asli (arah yang berlawanan). Inilah sebabnya mengapa lebih disukai dalam implementasi untuk konvolusi ketika menghitung arah yang berlawanan (yaitu untuk menghindari banyak perkalian 0 yang tidak perlu yang disebabkan oleh matriks jarang yang dihasilkan dari pengisian input).

Image ---> convolution ---> Result

Result ---> transposed convolution ---> "originalish Image"

Terkadang Anda menyimpan beberapa nilai di sepanjang jalur konvolusi dan menggunakan kembali informasi itu ketika "kembali":

Result ---> transposed convolution ---> Image

Mungkin itulah alasan mengapa hal itu secara keliru disebut "dekonvolusi". Namun, itu memang ada hubungannya dengan matriks transpos konvolusi (C ^ T), maka nama yang lebih tepat "transvolusi konvolusi".

Jadi sangat masuk akal ketika mempertimbangkan biaya komputasi. Anda akan membayar lebih banyak untuk amazon GPU jika Anda tidak akan menggunakan konvolusi yang dialihkan.

Baca dan saksikan animasi di sini dengan hati-hati: http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html#no-zero-padding-unit-strides-transposed

Beberapa bacaan lain yang relevan:

Transpos (atau lebih umum, transpos Hermitian atau konjugat) dari filter adalah filter yang cocok [3]. Ini ditemukan saat membalikkan kernel dan mengambil konjugat dari semua nilai [2].

Saya juga baru dalam hal ini dan akan berterima kasih atas umpan balik atau koreksi.

[1] http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html

[2] http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html#transposed-convolution-arithmetic

[3] https://en.wikipedia.org/wiki/Matched_filter



1
Saya pikir ini adalah jawaban terbaik !!!
kli_nlpr

10

Kita bisa menggunakan PCA untuk analogi.

Saat menggunakan conv, forward pass adalah mengekstraksi koefisien komponen utama dari gambar input, dan pass mundur (yang memperbarui input) adalah menggunakan (gradien) koefisien untuk merekonstruksi gambar input baru, sehingga gambar input baru memiliki koefisien PC yang lebih cocok dengan koefisien yang diinginkan.

Saat menggunakan deconv, operan maju dan mundur mundur dibalik. Pass maju mencoba merekonstruksi gambar dari koefisien PC, dan pass mundur memperbarui koefisien PC yang diberikan (gradien) gambar.

Dek lulus maju melakukan persis gradien perhitungan yang diberikan dalam posting ini: http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/

Itu sebabnya dalam implementasi caffe dari deconv (lihat jawaban Andrei Pokrovsky), forward pass deconv memanggil backward_cpu_gemm (), dan pass backward memanggil forward_cpu_gemm ().


6

Selain jawaban David Dao: Dimungkinkan juga untuk memikirkan sebaliknya. Alih-alih berfokus pada piksel input (resolusi rendah) mana yang digunakan untuk menghasilkan piksel output tunggal, Anda juga dapat fokus pada masing-masing piksel input mana yang berkontribusi pada wilayah piksel output mana.

Ini dilakukan dalam publikasi penyulingan ini , termasuk serangkaian visualisasi yang sangat intuitif dan interaktif. Salah satu keuntungan berpikir ke arah ini adalah menjelaskan artefak kotak-kotak menjadi mudah.


5

Konvolusi dari perspektif DSP

Saya agak terlambat untuk ini, tetapi masih ingin berbagi perspektif dan wawasan saya. Latar belakang saya adalah teori fisika dan pemrosesan sinyal digital. Secara khusus saya mempelajari wavelet dan konvolusi hampir di tulang punggung saya;)

Cara orang-orang di komunitas belajar yang mendalam berbicara tentang konvolusi juga membingungkan saya. Dari sudut pandang saya, apa yang tampaknya tidak ada adalah pemisahan keprihatinan yang tepat. Saya akan menjelaskan konvolusi pembelajaran yang mendalam menggunakan beberapa alat DSP.

Penolakan

Penjelasan saya akan sedikit bergelombang dan tidak matematis untuk mendapatkan poin utama.


Definisi

xn={xn}n=={,x1,x0,x1,}

ynxn

(yx)n=k=ynkxk

q=(q0,q1,q2)x=(x0,x1,x2,x3)T

qx=(q1q000q2q1q000q2q1q000q2q1)(x0x1x2x3)

kN

kxn=xnk

kk1

kxn={xn/kn/kZ0otherwise

k=3

3{,x0,x1,x2,x3,x4,x5,x6,}={,x0,x3,x6,}
3{,x0,x1,x2,}={x0,0,0,x1,0,0,x2,0,0,}

k=2

2x=(x0x2)=(10000010)(x0x1x2x3)

dan

2x=(x00x10)=(10000100)(x0x1)

k=kT


Konvolusi Pembelajaran Mendalam oleh Bagian

qx

  • kk(qx)
  • k(kq)x
  • kq(kx)

q(kx)=q(kTx)=(k(q)T)Tx

(q)q

q(kx)=(q1q000q2q1q000q2q1q000q2q1)(10000100)(x0x1)=(q1q200q0q1q200q0q1q200q0q1)T(10000010)T(x0x1)=((10000010)(q1q200q0q1q200q0q1q200q0q1))T(x0x1)=(k(q)T)Tx

Seperti yang dapat dilihat adalah operasi yang dialihkan, demikianlah namanya.

Koneksi ke Upsampling Neighbor Terdekat

2(11)xq2(11)qxq=(q0q1q2)

(11)q=(q0q0+q1q1+q2q2),

yaitu kita dapat mengganti upsampler berulang dengan faktor 2 dan konvolusi dengan kernel ukuran 3 oleh konvolusi yang ditransformasikan dengan ukuran kernel 4. Konvolusi yang dialihkan ini memiliki "kapasitas interpolasi" yang sama, tetapi akan dapat mempelajari interpolasi yang lebih cocok.


Kesimpulan dan Keterangan Akhir

Saya harap saya dapat mengklarifikasi beberapa konvolusi umum yang ditemukan dalam pembelajaran mendalam sedikit dengan memisahkan mereka dalam operasi mendasar.

Saya tidak menutup kolam di sini. Tapi ini hanya downsampler nonlinear dan dapat ditangani dalam notasi ini juga.


Jawaban yang sangat bagus. Mengambil perspektif matematika / simbolis sering mengklarifikasi hal-hal. Apakah saya benar dalam berpikir bahwa istilah "dekonvolusi" dalam konteks ini bertentangan dengan terminologi yang ada ?
user76284

Itu tidak benar-benar berbenturan, itu hanya tidak masuk akal. Dekonvolusi hanya konvolusi dengan operator upample. Istilah dekonvolusi terdengar seperti itu akan menjadi semacam bentuk operasi terbalik. Berbicara tentang invers di sini hanya masuk akal dalam konteks operasi matriks. Ini mengalikan dengan matriks terbalik bukan operasi konvolusi terbalik (seperti divisi vs multiplikasi).
André Bergner

zθx=zzθz=x

θz=xz=(θ)+x

Singkatnya, yang disebut "lapisan dekonvolusi" OP sebenarnya tidak melakukan dekonvolusi. Itu melakukan sesuatu yang lain (apa yang Anda jelaskan dalam jawaban Anda).
user76284

4

Saya memiliki banyak kesulitan memahami apa yang sebenarnya terjadi di koran sampai saya menemukan posting blog ini: http://warmspringwinds.github.io/tensorflow/tf-slim/2016/11/22/upsampling-and-image-segmentation -dengan-tensorflow-dan-tf-slim /

Berikut ini adalah ringkasan bagaimana saya memahami apa yang terjadi dalam 2x upampling:

Informasi dari kertas

Contoh sederhana

  1. bayangkan gambar input berikut:

Masukkan gambar

  1. Konvolusi dengan fraksional berjalan bekerja dengan memasukkan faktor-1 = 2-1 = 1 nol di antara nilai-nilai ini dan kemudian dengan asumsi langkah = 1 nanti. Dengan demikian, Anda menerima gambar empuk 6x6 berikut

gambar empuk

  1. Filter bilinear 4x4 terlihat seperti ini. Nilai-nilainya dipilih sedemikian rupa sehingga bobot yang digunakan (= semua bobot yang tidak dikalikan dengan nol yang dimasukkan) berjumlah hingga 1. Tiga nilai uniknya adalah 0,56, 0,19, dan 0,06. Selain itu, pusat filter adalah per konvensi pixel di baris ketiga dan kolom ketiga.

Saring

  1. Menerapkan filter 4x4 pada gambar empuk (menggunakan padding = 'sama' dan melangkah = 1) menghasilkan gambar 6x6 upampled berikut:

Gambar yang ditingkatkan

  1. Upampling semacam ini dilakukan untuk setiap saluran secara individual (lihat baris 59 di https://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/surgery.py ). Pada akhirnya, upampling 2x benar-benar mengubah ukuran yang sangat sederhana menggunakan interpolasi bilinear dan konvensi tentang bagaimana menangani perbatasan. Upacara 16x atau 32x bekerja dengan cara yang sama, saya percaya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.