【发布时间】:2019-09-12 01:14:16
【问题描述】:
我正在使用时变图嵌入,在每个时间步,图的邻接矩阵都会发生变化。主要思想是通过查看一组节点特征和邻接矩阵来执行图的每个时间步长的节点嵌入。节点嵌入步骤又长又复杂,不是问题的核心部分,所以我将跳过这部分。可以说我使用图卷积网络来嵌入节点。
假设我有一堆大小为 NxN 的 B 个邻接矩阵 A,其中 B = 批量大小,N = 图中的节点数。此外,矩阵根据时间序列堆叠,其中索引 i 中的矩阵位于索引 i+1 中的矩阵之前。我已经嵌入了图形的节点,这会产生一个维度为 B x N x E 的矩阵,其中 E = 嵌入的大小(参数)。请注意,模型必须处理任何图,因此,N 不是参数。另一个重要的评论是,每个批次都包含来自同一个图的邻接矩阵,因此一个批次的所有矩阵都具有相同的节点数,但其他批次的矩阵可能具有不同的节点数。
我现在需要通过 LSTM 单元传递这些嵌入。我以前从未使用过 Keras,所以我很难将 Keras LSTM 融合到我的 Tensorflow 代码中。我想要做的是:通过LSTM传递每个节点嵌入,使得时间步数= B和LSTM批量大小= N,即我的LSTM的输入具有形状[N,B,E],其中N 和 B 只有通过执行时间才能知道。我希望我的 LSTM 的输出具有 [B, E*E] 的形状。嵌入矩阵在这里称为 self.embed_mat。这是我的代码:
def _LSTM_layer(self):
with tf.variable_scope(self.scope, reuse=tf.AUTO_REUSE), tf.device(self.device):
in_shape = tf.shape(self.embed_mat)
lstm_input = tf.reshape(self.embed_mat, [in_shape[1], in_shape[0], EMBED_SIZE]) #lstm = [N, B, E]
input_plh = K.placeholder(name="lstm_input", shape=(None, None, EMBED_SIZE))
lstm = LSTM(EMBED_SIZE*EMBED_SIZE, input_shape=(None, None, EMBED_SIZE))
get_output = K.function(inputs=[input_plh], outputs=[lstm(input_plh)])
h = get_output([lstm_input])
我对 K.function 部分有点迷茫。我想要的只是 LSTM 单元的输出张量。我已经看到,为了使用 Keras 实现这一点,我们需要使用 K.function,但我不太明白它的作用。当我调用 get_output([lstm_input]) 时,出现以下错误:
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'worker_global/A/shape' with dtype int64 and shape [?]
这里,A 是维度为 BxNxN 的堆叠邻接矩阵。这里发生了什么?在图形构建步骤中是否需要知道 N 的值?我想我在 LSTM 单元上犯了一些愚蠢的错误,但我不明白它是什么。
提前致谢!
【问题讨论】:
标签: python-3.x tensorflow keras lstm