Koe*_*oen 3 convolution neural-network theano conv-neural-network
我想用Theano训练一个简单的卷积自动编码器,它一直很好用.但是,我没有看到conv2d在使用子采样(stride)时如何反转命令.有没有一种有效的方法可以在使用步幅时"反转"卷积命令,如下图所示?

例如,我想更改以下内容......
from theano.tensor.nnet.conv import conv2d
x = T.tensor4('x')
y = T.tanh( conv2d( x, W, border_mode='valid', subsample = (1,1) ) )
z = conv2d( y, Wprime, border_mode='full', subsample = (1,1) )
Run Code Online (Sandbox Code Playgroud)
......进入的情况subsample = (2,2).第一层将按预期工作.但是,第二层将有效地"用步幅1进行卷积,然后丢弃一半的输出".这显然是与我正在寻找的不同的操作 - z甚至不会像长度一样具有相同数量的神经元x.第二个conv2d命令应该"重建"原件x?
我从中推断出你打算使用绑定权重,即如果第一个操作是矩阵乘法W,那么输出将用W.T伴随矩阵生成.在您的情况下,您将寻找卷积运算符的伴随,然后进行子采样.
(编辑:我错误地推断,你可以使用任何过滤器来'去卷积',只要你得到正确的形状.但是,谈论伴随仍然是信息性的.你将能够放松这个假设.)
由于卷积运算符和子采样运算符是线性算子,让由表示它们C和S分别并观察卷积+二次采样的图像x将是
S C x
Run Code Online (Sandbox Code Playgroud)
并且y(与生活在同一空间中S C x)的伴随操作将是
C.T S.T y
Run Code Online (Sandbox Code Playgroud)
现在,ST只是通过在所有条目周围添加零来对原始图像大小进行上采样,y直到获得正确的大小.
从你的帖子中,你似乎意识到步幅(1,1)的卷积运算符的伴随 - 它是带有反向滤波器和反向的卷积border_mode,即带有filters.dimshuffle(1, 0, 2, 3)[:, :, ::-1, ::-1]和切换border_mode='valid'到border_mode='full'.
连接上采样和这个反向滤波器卷积,你获得你寻找的伴随.
注意:可能有一些方法可以利用渐变T.grad或T.jacobian自动获得渐变,但我不知道这是如何完成的.
编辑:在那里,我把它写下来:)
import theano
import theano.tensor as T
import numpy as np
filters = theano.shared(np.random.randn(4, 3, 6, 5).astype('float32'))
inp1 = T.tensor4(dtype='float32')
subsampled_convolution = T.nnet.conv2d(inp1, filters, border_mode='valid', subsample=(2, 2))
inp2 = T.tensor4(dtype='float32')
shp = inp2.shape
upsample = T.zeros((shp[0], shp[1], shp[2] * 2, shp[3] * 2), dtype=inp2.dtype)
upsample = T.set_subtensor(upsample[:, :, ::2, ::2], inp2)
upsampled_convolution = T.nnet.conv2d(upsample,
filters.dimshuffle(1, 0, 2, 3)[:, :, ::-1, ::-1], border_mode='full')
f1 = theano.function([inp1], subsampled_convolution)
f2 = theano.function([inp2], upsampled_convolution)
x = np.random.randn(1, 3, 10, 10).astype(np.float32)
f1x = f1(x)
y = np.random.randn(*f1x.shape).astype(np.float32)
f2y = f2(y)
p1 = np.dot(f1x.ravel(), y.ravel())
p2 = np.dot(x.ravel(), f2y[:, :, :-1].ravel())
print p1 - p2
Run Code Online (Sandbox Code Playgroud)
p1等于p2证实f2是f1的伴随
| 归档时间: |
|
| 查看次数: |
2592 次 |
| 最近记录: |