我已经在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
批次尺寸?
答案 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要求第一维(批次)始终保持“无”或未知。