如何将None维度添加回Tensor?

时间:2018-11-23 08:17:06

标签: python tensorflow keras reshape

我已经在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批次尺寸?

2 个答案:

答案 0 :(得分:0)

如果您具有完全定义的形状(如(1,)),则不需要None尺寸,因为您确切知道张量具有多少个元素。但是,您可以重塑形状,使其具有两个尺寸,以替换您的重塑形状:

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

这将为您提供形状为(1, 1)的数组,该数组与形状(None, 1)兼容,因此应该可以。请注意,-1中的reshape意味着“需要多少个元素来容纳这种形状的张量”,但是在这种情况下,您知道只有一个元素,因此使用方法相同:

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

再次,因为形状是完全定义的,并且您知道每个尺寸的大小应准确。但是,使用-1很方便,因为无论您是否完全知道形状,它都可以工作,并且Keras / TensorFlow会确定尺寸大小(如果可以计算尺寸,则尺寸将具有必需的尺寸,或者{{ 1}}(如果形状的一部分未知)。

答案 1 :(得分:0)

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要求第一维(批次)始终保持“无”或未知。