【问题标题】:Tensorflow tf.squeeze alternativesTensorflow tf.squeeze 替代品
【发布时间】:2018-12-04 00:10:12
【问题描述】:

我有以下图片:

import tensorflow as tf
tf.enable_eager_execution()
tf.executing_eagerly()    

img = Image.open('image.jpg')
try:
    data = np.asarray(img, dtype='uint8' )
except SystemError:
    data = np.asarray(img.getdata(), dtype='uint8' )

重塑:

tf.shape(data)
<tf.Tensor: id=2, shape=(3,), dtype=int32, numpy=array([263, 320,   3], dtype=int32)>

image = tf.expand_dims(data, 0)
tf.shape(image)
<tf.Tensor: id=16, shape=(4,), dtype=int32, numpy=array([  1, 263, 320,   3], dtype=int32)>

 tf.squeeze(image, squeeze_dims=[0])
<tf.Tensor: id=22, shape=(263, 320, 3), dtype=uint8, numpy=...>

如何用类似的命令替换最后的tf.squeeze(例如:tf.reshape)?

【问题讨论】:

  • tf.reshape(image, [263, 320, 3], name=None)
  • 我怎样才能使这个通用?没有专门选择 Tensor 的 3 个元素?
  • @spicyramen 你的意思是它不一定是4维吗?
  • 我会一直处理图片,需要先tf.expand_dims(data, 0) 将张量转换成4维,然后再squeeze,只是找squeeze替代。

标签: python tensorflow reshape


【解决方案1】:

另一种选择,如果你知道第一个维度的大小是 1,你可以这样做:

tf.reshape(image, tf.shape(image)[1:])

不过,如前所述,tf.squeeze 似乎是您的直接解决方案。

【讨论】:

  • 只是想知道,你知道在这种情况下如何“智能”重塑吗?直觉上,在这里重塑而不是仅仅索引似乎有点浪费,但我想也许重塑看到形状已经“几乎”匹配并且简单地删除了第一个维度。
  • @xdurch0 我真的不知道,我的意思是至少对于连续张量 reshape 应该只是形状信息的变化而不需要进一步计算,但无论如何它需要更多步骤,即查询初始形状并对其进行切片(即使计算量可以忽略不计)。就我个人而言,我会使用挤压或索引来做到这一点,就像在你的回答中一样(我发布了重塑解决方案,因为问题提出了它),主要是为了清楚起见,但是在某些情况下它可能也更高效。
【解决方案2】:

您可以使用image[0] 选择图像的第一“行”。如果 image 是形状 [1, w, h, c] 这将返回一个 [w, h, c] 张量。虽然我不明白tf.squeeze 的问题是什么。 squeeze(image, axis=0) 做同样的事情并防止其他轴(例如通道轴)也是大小为 1 的情况。

【讨论】:

    猜你喜欢
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2011-06-10
    • 2014-04-18
    • 2012-04-08
    • 2012-07-09
    相关资源
    最近更新 更多