如何在Keras中重复两个后端的未知维度

时间:2016-09-08 16:03:17

标签: machine-learning tensorflow deep-learning theano keras

例如(我可以毫无问题地使用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)

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])