我想用graph_cnn(Defferrard et al. 2016)來輸入節點數量的變化。作者提供了示例代碼(請參閱graph_cnn)。下面是我認爲的代碼的關鍵部分張量流中graph_cnn的批處理
def chebyshev5(self, x, L, Fout, K):
N, M, Fin = x.get_shape()
N, M, Fin = int(N), int(M), int(Fin)
# Rescale Laplacian and store as a TF sparse tensor. Copy to not modify the shared L.
L = scipy.sparse.csr_matrix(L)
L = graph.rescale_L(L, lmax=2)
L = L.tocoo()
indices = np.column_stack((L.row, L.col))
L = tf.SparseTensor(indices, L.data, L.shape)
L = tf.sparse_reorder(L)
# Transform to Chebyshev basis
x0 = tf.transpose(x, perm=[1, 2, 0]) # M x Fin x N
x0 = tf.reshape(x0, [M, Fin*N]) # M x Fin*N
x = tf.expand_dims(x0, 0) # 1 x M x Fin*N
def concat(x, x_):
x_ = tf.expand_dims(x_, 0) # 1 x M x Fin*N
return tf.concat([x, x_], axis=0) # K x M x Fin*N
if K > 1:
x1 = tf.sparse_tensor_dense_matmul(L, x0)
x = concat(x, x1)
for k in range(2, K):
x2 = 2 * tf.sparse_tensor_dense_matmul(L, x1) - x0 # M x Fin*N
x = concat(x, x2)
x0, x1 = x1, x2
x = tf.reshape(x, [K, M, Fin, N]) # K x M x Fin x N
x = tf.transpose(x, perm=[3,1,2,0]) # N x M x Fin x K
x = tf.reshape(x, [N*M, Fin*K]) # N*M x Fin*K
# Filter: Fin*Fout filters of order K, i.e. one filterbank per feature pair.
W = self._weight_variable([Fin*K, Fout], regularization=False)
x = tf.matmul(x, W) # N*M x Fout
return tf.reshape(x, [N, M, Fout]) # N x M x Fout
從本質上講,我覺得這樣做有什麼方法可以簡化爲像
return = concat{(L*x)^k for (k=0 to K-1)} * W
x
是N x M x Fin
(大小可變的輸入在任何批次中):
L
是一組運算符x
,每個運算符的大小爲M x M
,與匹配的對應值樣品(大小在任何批次中可變)。
W
是要優化的神經網絡參數,它的大小是Fin x K x Fout
N
:樣本的批處理(大小固定爲任何批次)號碼;
M
:圖中節點的數量(任意批次中的大小變量);
Fin
:輸入特徵的數量(大小固定爲任何批次)]。
Fout
是輸出特徵的數量(對於任何批次固定的大小)。
K
是一個常數,表示在圖表
對於單的示例步驟(跳)的數量,在上述代碼工作。但是,由於x
和L
對於批次中的每個樣品都具有可變長度,所以我不知道如何使其適用於一批樣品。