例子
knowledge_matrix = tf.Variable(tf.compat.v1.keras.initializers.glorot_uniform()([num_skills, hidden_size]),dtype=tf.float32, trainable=True, name = 'knowledge_matrix')
knowledge_matrix = tf.tile(tf.expand_dims(knowledge_matrix, 0), tf.stack([batch_size, 1, 1]))#将知识矩阵沿着不同维度进行复制,以适应当前的批量大小
说明
上述第一行即创建一个用于表示知识矩阵的 TensorFlow 变量。该矩阵的形状为 [num_skills, hidden_size],其中 num_skills 表示技能数量,hidden_size 表示隐藏层大小。
为了更好的说明tile函数,现在将num_skills设成3,hidden_size设成5,即知识矩阵是一个3x5的矩阵。
tf.expand_dims(knowledge_matrix, 0)
对于 tf.expand_dims(knowledge_matrix, 0),其中的 0 表示在张量的第 0 维(也就是最外层的维度)上进行扩展,使得原来的二维张量变成了一个三维张量。通俗的说,在执行 tf.expand_dims(knowledge_matrix, 0) 后,会在原始矩阵的外面再套一层维度,变成一个形状为 (1, 3, 5) 的三维张量。
tf.stack([batch_size, 1, 1])
把这段看成一个列表,即等价[batch_size, 1, 1],假设batch_size为10,则为[10, 1, 1],那么刚刚那个冗余的代码就可以看成是knowledge_matrix = tf.tile(tf.expand_dims(knowledge_matrix, 0), [10, 1, 1])
根据后面这个参数列表,这个参数列表也就对应了在第几个维度上复制几次,即在第一个维度上复制10次,那就是1x10,在第二和第三个维度上都只复制1次,那就是1x1。
所以最后我们得到的知识矩阵的维度就是[10,3,5].
也就是说,这个操作将原本只有知识点和知识点隐藏维度的矩阵扩展到了一个批次中对应的每个数据上,即这个批次中每一个数据都有自己对应的一个知识矩阵。
expand_dims做的是一个扩展维度的操作,但是不知道具体扩展多少维,而后面的列表才是对应维度扩展多少的数据。
以上个人理解,不喜勿喷