如何在 Keras 中为两个后端重复未知维度
How to repeat an unknown dimension in Keras for both backends
例如(我可以毫无问题地使用 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])
例如(我可以毫无问题地使用 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])