卷积以降低一维向量的维数
Convolution to reduce dimensionality of one dimensional vector
在 CNN 中,如果输出是一维向量(例如,pre-logit 层),如何仅使用卷积将维数降低到指定大小?
如何派生过滤器 dimensions/receptive 字段来完成这样的任务?
我知道这可以通过在网络的末端堆叠一个全连接层来实现,但这似乎不太优雅。
你有可能在卷积之后添加一个池化层吗?如果是,这就是这一层的主要目的之一,将向量下采样到较低的维度。
否则,应用过滤器的数量就是输出的维度space。
一维卷积呢?您可以像下面这样使用 strides:
n,w = x.shape
c = 1
x = x.reshape(n,w,c) # 1d vector with one 1 channel
x = conv1d(x, 1, 3, stride=2, pad=1) # 1 filter so output size will be (n,w/2,c)
x = x.reshape(n,w//2)
这将为您提供当前维度的整数除法。或者您可以为输出的每个维度设置一个通道,然后在整个 1D 区域上汇集:
x = x.reshape(n,w,c)
x = conv1d(x, d, 3, pad=1) # d filters so output (n,w,d)
x = x.mean(1) # mean over 1d space so now (n,d)
无法保证其中任何一个是否真的能正常工作,但这是一个神经网络,它们可能不会破坏任何太糟糕的东西。
最后,金手指答案:
x = x.reshape(n,c,w) # (n,1,w)
x = conv1d(x, d, 1) # (n,1,d)
x = x.reshape(n,d)
使用All Convolutional Net paper and later extensively used in 中最初提出的想法,即应用卷积进行降维。
诀窍是用一个单位 filter
执行卷积(1x1
用于 2-D 卷积,1x1x1
用于 3-D 等等),过滤器数量较少.如今,这个技巧一直被用来在非常深的卷积网络中节省计算量,所以你也可以在卷积层之前使用它。在您的问题中,输出张量是一维的(批量大小除外),因此使用具有 1
内核大小的一维卷积。
这是tensorflow中的代码,它将张量长度从64减少到32:
# `x` shape: [batch, length] = [?, 64]
layer = tf.expand_dims(x, 2) # reshape to: [batch, channels, 1] = [?, 64, 1]
output = tf.layers.conv1d(layer, filters=32, kernel_size=1,
strides=1, padding='valid',
data_format='channels_first')
# new shape: [batch, filters, 1] = [?, 32, 1]
output = tf.squeeze(output) # reshape to: [batch, length] = [?, 32]
在 CNN 中,如果输出是一维向量(例如,pre-logit 层),如何仅使用卷积将维数降低到指定大小?
如何派生过滤器 dimensions/receptive 字段来完成这样的任务?
我知道这可以通过在网络的末端堆叠一个全连接层来实现,但这似乎不太优雅。
你有可能在卷积之后添加一个池化层吗?如果是,这就是这一层的主要目的之一,将向量下采样到较低的维度。
否则,应用过滤器的数量就是输出的维度space。
一维卷积呢?您可以像下面这样使用 strides:
n,w = x.shape
c = 1
x = x.reshape(n,w,c) # 1d vector with one 1 channel
x = conv1d(x, 1, 3, stride=2, pad=1) # 1 filter so output size will be (n,w/2,c)
x = x.reshape(n,w//2)
这将为您提供当前维度的整数除法。或者您可以为输出的每个维度设置一个通道,然后在整个 1D 区域上汇集:
x = x.reshape(n,w,c)
x = conv1d(x, d, 3, pad=1) # d filters so output (n,w,d)
x = x.mean(1) # mean over 1d space so now (n,d)
无法保证其中任何一个是否真的能正常工作,但这是一个神经网络,它们可能不会破坏任何太糟糕的东西。
最后,金手指答案:
x = x.reshape(n,c,w) # (n,1,w)
x = conv1d(x, d, 1) # (n,1,d)
x = x.reshape(n,d)
使用All Convolutional Net paper and later extensively used in
诀窍是用一个单位 filter
执行卷积(1x1
用于 2-D 卷积,1x1x1
用于 3-D 等等),过滤器数量较少.如今,这个技巧一直被用来在非常深的卷积网络中节省计算量,所以你也可以在卷积层之前使用它。在您的问题中,输出张量是一维的(批量大小除外),因此使用具有 1
内核大小的一维卷积。
这是tensorflow中的代码,它将张量长度从64减少到32:
# `x` shape: [batch, length] = [?, 64]
layer = tf.expand_dims(x, 2) # reshape to: [batch, channels, 1] = [?, 64, 1]
output = tf.layers.conv1d(layer, filters=32, kernel_size=1,
strides=1, padding='valid',
data_format='channels_first')
# new shape: [batch, filters, 1] = [?, 32, 1]
output = tf.squeeze(output) # reshape to: [batch, length] = [?, 32]