【问题标题】:Keras weight contraints including both bias and kernel matrix at the same timeKeras 权重约束同时包括 bios 和内核矩阵
【发布时间】:2021-09-21 22:51:53
【问题描述】:

我的问题与 keras 如何实现权重约束有关,尤其是在密集层中。我主要使用 R 及其 keras 实现,所以我将在这里使用他们的符号,但如果有人在 Python 中有解决方案,我也会很高兴。

据我所知,像 constraint_maxnorm() 这样的 keras 约束可以应用于带有参数 kernel_constraint 或 bias_constraint 的 layer_dense(),其中内核指的是没有偏差项的权重矩阵。但是,为了测试新方法,我认为能够将约束应用于完整权重矩阵也会很有用,其中偏差向量在权重矩阵中形成额外的行。这种约束的一个例子是将入射到神经元的权重向量的 L1 范数限制为 1(考虑到该神经元的偏差也作为所述向量的一个元素)。

从这个意义上说,可以创建custom constraints,但问题是它们接收内核权重作为输入,而不是内核权重和偏差,并且输出也只是内核权重,而不是完整的权重矩阵。

是否可以在 keras 或 tensorflow 中实现这种同时影响内核和偏差的约束?从这个意义上说,能够创建同时接受内核权重和偏差作为输入的自定义约束,然后在内核和偏差处应用两次所需的约束就足够了。

【问题讨论】:

标签: python r tensorflow keras neural-network


【解决方案1】:

您可以通过定义一个自定义层来实现这一点,该层将权重和偏差组合成一个带有约束的张量。然后,您可以在层 call 方法中拆分张量。例如:

library(tensorflow)
library(keras)

my_custom_constraint <- ...

MyCustomLayer(keras$layers$Layer) %py_class% {
  initialize <- function(units = 32) {
    super$initialize()
    self$units <- units
  }
  
  build <- function(input_shape) {
    self$combined_w_b <- self$add_weight(
      shape = shape(tail(input_shape, 1) + 1, self$units)
      initializer = "random_normal",
      trainable = TRUE,
      constraint = my_custom_constraint
    )
  }
  
  call <- function(inputs) {
    b <- self$combined_w_b[1, , drop = TRUE]
    w <- self$combined_w_b[2:NULL,]
    tf$matmul(inputs, w) + b
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2013-07-25
    • 1970-01-01
    相关资源
    最近更新 更多