在 Tensorflow 中删除张量的维度

Posted

技术标签:

【中文标题】在 Tensorflow 中删除张量的维度【英文标题】:Drop a dimension of a tensor in Tensorflow 【发布时间】:2019-02-26 10:16:01 【问题描述】:

我有一个形状为 (50, 100, 1, 512) 的张量,我想重塑它或删除第三个维度,以便新张量的形状为 (50, 100, 512)

我尝试过tf.slicetf.squeeze

a = tf.slice(a, [50, 100, 1, 512], [50, 100, 1, 512])
b = tf.squeeze(a)

当我尝试打印 ab 的形状时,一切似乎都正常,但是当我开始训练我的模型时,出现了这个错误

tensorflow.python.framework.errors_impl.InvalidArgumentError: Expected size[0] in [0, 0], but got 50
     [[Node: Slice = Slice[Index=DT_INT32, T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](MaxPool_2, Slice/begin, Slice/size)]]

我的slice 有什么问题吗?我该如何解决。谢谢

【问题讨论】:

你试过.reshape()吗?尺寸也有任何价值吗?对需要的数据进行切片是不明智的。不是我以前见过的做法。 @Kenpachi:我没有尝试过 .reshape() 但那个尺寸并不重要,所以我想放弃它。 【参考方案1】:

一般tf.squeeze 会删除尺寸。

a = tf.constant([[[1,2,3],[3,4,5]]])

上面的张量形状是[1,2,3]。执行挤压操作后,

b = tf.squeeze(a)

现在,张量形状是[2,3]

【讨论】:

【参考方案2】:

在这种情况下我使用了tf.slice错误,应该是这样的:

a = tf.slice(a, [0, 0, 0, 0], [50, 100, 1, 512])
b = tf.squeeze(a)

您可以通过查看tf.slice documentation 找出原因

【讨论】:

为什么还要使用slice?只需使用 squeeze 就可以了。 @xdurch0 我以为squeeze 只删除尺寸= 1的暗淡【参考方案3】:

有多种方法可以做到这一点。 Tensorflow 已经开始支持索引。试试

a = a[:,:,0,:]

a = a[:,:,-1,:]

a = tf.reshape(a,[50,100,512])

【讨论】:

以上是关于在 Tensorflow 中删除张量的维度的主要内容,如果未能解决你的问题,请参考以下文章

如何在图构建时获取张量的维度(在 TensorFlow 中)?

如何在 Tensorflow 中对无维度的张量进行切片

如何在 Keras / Tensorflow 中将(无,)批量维度重新引入张量?

tensorflow之tf.squeeze()

张量(tensor)的阶、形状、数据类型

tensorflow之张量扩张Broadcasting合并分割