机器学习 – 如何在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)

最佳答案 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])
点赞