Не совсем уверен, что именно вы хотите сделать, потому что для меня diagonal
- это что-то для квадратной матрицы, подразумевая, что размерность входных и выходных данных вашего слоя должна быть неизменной.
В любом случае, давайте сначала поговорим о случае с квадратной матрицей.Я думаю, что есть два способа реализации весовой матрицы со всеми значениями нулей вне диагонали.
Метод 1: только концептуально следуйте идее квадратной матрицы и реализуйте этот слой с обучаемым вектором веса следующим образом.
# instead of writing y = K.dot(x,W),
# where W is the weight NxN matrix with zero values of the diagonal.
# write y = x * w, where w is the weight vector 1xN
Метод 2: используйте слой по умолчанию Dense
, нос вашим собственным ограничением .
# all you need to create a mask matrix M, which is a NxN identity matrix
# and you can write a contraint like below
class DiagonalWeight(Constraint):
"""Constrains the weights to be diagonal.
"""
def __call__(self, w):
N = K.int_shape(w)[-1]
m = K.eye(N)
w *= m
return w
Конечно, вы должны использовать Dense( ..., kernel_constraint=DiagonalWeight())
.