例如(我可以用Theano轻松实现):
# log_var的形状 --> (num, )
# Mean的形状 --> (?, 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
表示),所以这不是问题。
另外,我不确定你的TensorFlow代码是否正确。你重塑为(1, -1)
,意味着轴0的维度将是1。我认为你可能更希望这样做:
std_var = K.tile(K.reshape(K.exp(log_var), (-1, num)), K.shape(Mean)[0])