首页 > 解决方案 > Keras 权重约束同时包括偏差和核矩阵

问题描述

我的问题与 keras 如何实现权重约束有关,特别是在密集层中。我主要使用R它的 keras 实现,所以我将在这里使用他们的符号,但如果有人在Python.

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

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

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

标签: pythonrtensorflowkerasneural-network

解决方案


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

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
  }
}

推荐阅读