Tensorflow 减少了 3 阶张量的维度

Tensorflow reduce dimensions of rank 3 tensor

我正在尝试构建论文中研究的 CLDNN here

在卷积层之后,特征通过一个降维层。在特征离开 conv 层时,维度为 [?, N, M]。 N代表windows的个数,我认为网络需要降维M,所以dim-red层之后的特征维度是[?,N,Q],其中Q < M

我有两个问题。

  1. 如何在 TensorFlow 中执行此操作?我尝试使用

    的权重
    W = tf.Variable( tf.truncated_normal([M,Q],stddev=0.1) )
    

    我认为 tf.matmul(x,W) 的乘法会产生 [?, N, Q][?, N, M][M, Q] 不是有效的乘法维度。我想保持N不变并减少M的维度。

  2. 我应该对 tf.matmul(x,W) 的结果应用哪种非线性?我正在考虑使用 ReLU,但我什至无法完成 #1。

根据链接论文(T. N. Sainath 等人:"Convolutional, Long Short-Term Memory, Fully Connected Deep Neural Networks"),

[...] reducing the dimensionality, such that we have 256 outputs from the linear layer, was appropriate.

这意味着,无论输入大小是多少,即 [?, N, M] 或任何其他维度(始终假设第一个维度是小批量中的样本数,用 ? 表示) ,输出将为 [?, Q],其中通常为 Q=256.

由于我们通过将输入与权重矩阵相乘来进行降维,因此不会保留任何空间信息。这意味着,每个输入是矩阵还是向量并不重要,因此我们可以将线性层的输入 x 重塑为 [?, N*M] 的维度。然后,我们可以创建一个简单的矩阵乘法 tf.matmul(x, W),其中 W 是维度为 [N*M, Q].

的矩阵
W = tf.Variable(tf.truncated_normal([N*M, Q], stddev=0.1))
x_vec = tf.reshape(x, shape=(-1, N*M))
y = tf.matmul(x_vec, W)

最后,关于问题2:在论文中,降维层是线性层,即你没有对输出应用非线性。