将层重塑为Keras中的斜对称矩阵

问题描述 投票:2回答:1

说我有一个keras模型(例如)

layers_NE<-keras_model_sequential()
layers_NE %>% layer_dense(units=Height,
                           activation = "relu",
                           trainable=TRUE,
                           input_shape = 4,
                           bias_initializer = "random_normal") 
          %>% layer_dense(units = (d^2),
                           activation = "linear",
                           trainable = TRUE,
                           bias_initializer = "random_normal")

例如,我想将最后一层重塑为斜对称矩阵输出,例如c(a,b,c)-> c(c(a,b),c(b,c)) (这里c(a,b,c)是我的网络输出的符号)

到目前为止,我已经尝试过:

layers_NE %>%layer_reshape(input_shape = (d^2),
                           target_shape = c(d,d)
                           )

输出具有正确的形状,但不是对称的。我该如何实现?

r keras deep-learning
1个回答
0
投票

我看到两种方法可以实现。比较简单的方法就是完全按照您最初的操作进行操作-在某个点上引入每个示例(d,d)具有二维正方形输出的图层,该图层不对称,然后通过将其添加到自己的转置版本中使其对称。它可能如下所示:

layers_NE<-keras_model_sequential()
layers_NE %>% layer_dense(units=Height,
                           activation = "relu",
                           trainable=TRUE,
                           input_shape = 4,
                           bias_initializer = "random_normal") 
          %>% layer_dense(units = (d^2),
                           activation = "linear",
                           trainable = TRUE,
                           bias_initializer = "random_normal")
          %>%layer_reshape(input_shape = (d^2),
                           target_shape = c(d,d)
                           )
          %>% layer_lambda(f=function(x) {
                             (x + k_permute_dimensions(x, pattern=c(1,3,2))) * 0.5
                           })

添加了具有其自身转置版本的模型后,结果将是对称的(我想这里不需要平均)。由于您必须实际训练d ^ 2单位而不是d(d + 1)/ 2,因此此解决方案中存在一些冗余。除此之外,应该可以,因为

第二个-更节省的解决方案是实际创建d(d + 1)/ 2个单元,并以“复制”非对角元素的方式将它们放入(d,d)形状。我相信您正在寻找的是创建例如使用k_gather功能的lambda层。但是唯一的节省是,在其中一层上训练更少的神经元。

© www.soinside.com 2019 - 2024. All rights reserved.