在 Keras 中,如何任意调整一维张量的大小?
Posted
技术标签:
【中文标题】在 Keras 中,如何任意调整一维张量的大小?【英文标题】:In Keras, how can I arbitrarily resize a 1D Tensor? 【发布时间】:2017-07-27 19:57:56 【问题描述】:为了使单通道图像和一维张量之间的 keras 连接操作成为可能,我需要重塑我的一维张量的长度以匹配两个图像尺寸并 填充所有带零的额外神经元。我该怎么做?
显示等效问题的示例代码:
from keras.layers import Input, Dense, Conv2D, Reshape, concatenate
inputs = Input(shape = (784,))
dense_layer = Dense(10)(inputs)
reshaped_layer = Reshape((28, 28, 1))(inputs)
convolved_layer = Conv2D(10, (3, 3))(reshaped_layer)
concatenated_layer = concatenate([convolved_layer, dense_layer])
ValueError:连接层需要具有匹配形状的输入,连接轴除外。得到输入形状:[(None, 26, 26, 10), (None, 10)]
当然,我不能在一维张量上使用 Reshape 来执行此操作,因为它没有正确数量的神经元,而且我不想展平和重塑卷积层,因为这会涉及丢失有用的空间信息。
有什么方法可以让我使用 numpy 数组制作一个形状正确的新 keras 层,其中包含 dense_layer
数据和填充?
【问题讨论】:
那么,你有一个形状为 (26, 26, 10) 的张量 A 和一个形状为 (10,) 的张量 B,你想将它们连接在一起吗?你想怎么做?这样你就有了一个形状为 (27, 27, 10) 的张量 C,其中 C[-1, -1, :] = B? 好吧,由于 convolved_layer 是 10 个 26x26 过滤图像的堆栈,我可以将dense_layer 形成一个 26x26 像素的图像,其中前 10 个像素是密集层的值(和其余的都是零),并将其放在 10 个过滤图像的顶部。在这种情况下,concatenated_layer 的最终尺寸将是 (26, 26, 11)。 【参考方案1】:好的,我需要 Keras ZeroPadding1D 层。 (线索就在名字里)。
from keras.layers import Input, Dense, Conv2D, Reshape, concatenate, ZeroPadding1D
inputs = Input(shape = (784,))
dense_layer = Dense(10)(inputs)
dense_layer_with_added_axis = Reshape((10, 1))(dense_layer)
dense_zero_padded = ZeroPadding1D(333)(dense_layer_with_added_axis)
dense_reshaped = Reshape((26, 26, 1))(dense_zero_padded)
reshaped_layer = Reshape((28, 28, 1))(inputs)
convolved_layer = Conv2D(10, (3, 3))(reshaped_layer)
concatenated_layer = concatenate([convolved_layer, dense_reshaped])
print(concatenated_layer._keras_shape)
输出:(无,26、26、11)
ZeroPadding1D 层的参数是在输入张量的任一侧添加的零的数量。所以在这种情况下,dense_zero_padded
层是一个一维数组,由 333 个零、来自dense_layer
的 10 个值和另外 333 个零组成。然后将其重新整形为 (26, 26, 1) 张量,它可以很好地堆叠在 convolved_layer
的过滤图像之上。
【讨论】:
以上是关于在 Keras 中,如何任意调整一维张量的大小?的主要内容,如果未能解决你的问题,请参考以下文章