例如(我可以毫无问题地使用Theano):
# log_var has shape --> (num, )
# Mean has shape --> (?, num)
std_var = T.repeat(T.exp(log_var)[None, :], Mean.shape[0], axis=0)
使用TensorFlow,我可以这样做:
std_var = tf.tile(tf.reshape(tf.exp(log_var), [1, -1]), (tf.shape(Mean)[0], 1))
但是我不知道如何为Keras做同样的事情,可能是这样的:
std_var = K.repeat(K.reshape(K.exp(log_var), [1, -1]), Mean.get_shape()[0])
或
std_var = K.repeat_elements(K.exp(log_var), Mean.get_shape()[0], axis=0)
...因为Mean
在轴0处的尺寸未知。
我需要这个用于自定义图层输出:
return K.concatenate([Mean, Std], axis=1)
答案 0 :(得分:2)
Keras有一个抽象层keras.backend
,您似乎已经找到了它(您将其称为K
)。该层提供了您需要的Theano和TensorFlow的所有功能。
说你的TensorFlow代码有效,这是
std_var = tf.tile(tf.reshape(tf.exp(log_var), [1, -1]), (tf.shape(Mean)[0], 1))
然后您可以将其翻译成抽象版本,如下所示:
std_var = K.tile(K.reshape(K.exp(log_var), (1, -1)), K.shape(Mean)[0])
Theano和TensorFlow都支持未知轴语法(未知轴的-1
),所以这不是问题。
另一方面,我不确定你的TF代码是否正确。你重塑为(1, -1)
,意味着0轴的维度为1.我认为你想要做的就是这样做:
std_var = K.tile(K.reshape(K.exp(log_var), (-1, num)), K.shape(Mean)[0])