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