【问题标题】:How do I add the None Dimension back to a Tensor?如何将无维度添加回张量?
【发布时间】:2019-04-25 20:12:12
【问题描述】:

我在 Lambda 层中进行了一些转换,现在我的形状为 (1,),我如何返回到 (None, 1)

这是我的操作

def function_lambda(x):
    import keras.backend

    aux_array = keras.backend.sign(x)
    #the shape is (?, 11) here OK

    aux_array = keras.backend.relu(aux_array)
    #the shape is (?, 11) here still OK

    aux_array = keras.backend.any(aux_array)
    #the shape is () here not OK

    aux_array = keras.backend.reshape(aux_array, [-1])
    #now the shape is (1,) almost OK

    return aux_array

我如何重塑和放回None Batch Dimension?

【问题讨论】:

  • 你弄明白了吗?
  • 我想知道同样的问题。你弄明白了吗?

标签: python tensorflow keras reshape


【解决方案1】:

如果你有一个完全定义的形状(比如(1,)),那么你就不需要None 维度,因为你确切地知道你的张量有多少元素。但是你可以重塑有两个维度来代替你重塑:

aux_array = keras.backend.reshape(aux_array, [-1, 1])

这会给你一个形状为(1, 1)的数组,它与形状(None, 1)兼容,所以应该没问题。请注意,reshape 中的 -1 表示“尽管需要许多元素来容纳这种形状的张量”,但在这种情况下,您知道您只有一个元素,因此使用相同:

aux_array = keras.backend.reshape(aux_array, [1, 1])

因为,同样,形状是完全定义的,并且您知道每个维度的大小应该是多少。但是,使用-1 很方便,因为无论您是否完全了解形状,它都可以工作,并且 Keras/TensorFlow 会计算出尺寸应该是多少(如果可以计算,尺寸将具有必要的尺寸,如果可以计算,则使用None部分形状未知)。

【讨论】:

  • 我认为这不是重点。在 Tensorflow 中定义模型以对张量进行操作时,通常需要第一个维度为 None 或 ?,以表示 minibatch 维度。例如,[None, 12, 12] 表示第一个维度没有完全指定,将在训练时设置。在这种情况下,确实需要“无”维度。
【解决方案2】:

tf.reshape 有一个限制,它不能与“无”维度一起使用。据我所知,我们可以定义“无”维度的唯一地方是 tf.placeholder。以下应该有效:

def function_lambda(x):
    import keras.backend

    aux_array = keras.backend.sign(x)
    #the shape is (?, 11) here OK

    aux_array = keras.backend.relu(aux_array)
    #the shape is (?, 11) here still OK

    aux_array = keras.backend.any(aux_array)
    #the shape is () here not OK

    aux_array = keras.backend.placeholder_with_default(aux_array, [None,1])
    #now the shape is (?,1) OK

    return aux_array

附加说明:在尝试使用 Google 机器学习引擎时,创建一个新的占位符以重新引入“无”维度非常有用。 MLE 要求第一个维度(批次)始终保持“无”或未知。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多