gpt4 book ai didi

neural-network - Theano:在自动编码器中用步幅(子采样)重建卷积

转载 作者:行者123 更新时间:2023-12-01 11:34:33 24 4
gpt4 key购买 nike

我想使用 Theano 训练一个简单的卷积自动编码器,它运行良好。但是,我看不出在使用子采样(跨步)时如何反转 conv2d 命令。使用步幅时是否有一种有效的方法来“反转”卷积命令,如下图所示?

Image shamelessly stolen and painted from http:/cs231n.github.io/convolutional-networks.

例如,我想改变以下......

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) )

... 进入 subsample = (2,2) 的情况。第一层将按预期工作。然而,第二层将有效地“以步长 1 进行卷积,然后丢弃一半的输出”。这显然与我正在寻找的操作不同 - z 的神经元数量甚至不会与 x 的长度相同。第二个 conv2d 命令应该是什么来“重建”原始的 x

最佳答案

我由此推断您打算绑定(bind)权重,即如果第一个操作是与 W 的矩阵乘法,则输出将由 W.T 生成,伴随矩阵。在您的情况下,您将因此寻找卷积运算符的伴随,然后是子采样。

(编辑:我推断错误,您可以使用任何过滤器来“反卷积”,只要您得到正确的形状。不过,谈论伴随仍然提供信息。之后您将能够放宽假设。 )

由于卷积算子和子采样算子是线性算子,我们分别用CS表示它们,观察卷积+子采样图像x 将是

S C x

y 上的伴随运算(与 S C x 位于同一空间)将是

C.T S.T y

现在,S.T 只不过是通过在 y 的所有条目周围添加零来对原始图像大小进行上采样,直到获得正确的大小。

从您的帖子中,您似乎知道步长 (1, 1) 的卷积运算符的伴随 - 它是具有反向过滤器和反向 border_mode 的卷积,即 filters.dimshuffle(1, 0, 2, 3)[:, :,::-1,::-1] 并从 border_mode='valid' 切换到 border_mode='full'.

连接上采样和这个反向滤波器卷积,你就得到了你想要的伴随。

注意:可能有一些方法可以利用梯度 T.gradT.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

p1 等于 p2 证实 f2 是 f1 的伴随

关于neural-network - Theano:在自动编码器中用步幅(子采样)重建卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28716618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com