Наименование весов слоя в пользовательском слое - PullRequest
2 голосов
/ 30 января 2020

У меня есть собственный слой в плотном подслое. Я хочу иметь возможность назвать вес этого подслоя. Однако использование name="my_dense" в инициализаторе подслоя, похоже, не делает этого; веса просто получают в честь внешнего пользовательского слоя.

Чтобы проиллюстрировать проблему, предположим, что мне нужен пользовательский слой, который просто укладывает два плотных слоя. Я напечатаю имена весов этого пользовательского слоя.

class DoubleDense(keras.layers.Layer):
  def __init__(self, units, **kwargs):
    self.dense1 = keras.layers.Dense(units, name="first_dense")
    self.dense2 = keras.layers.Dense(units, name="second_dense")
    super(DoubleDense, self).__init__(**kwargs)

  def build(self, input_shape):
    self.dense1.build(input_shape)
    self.dense2.build(self.dense1.units)

  def call(self, input):
    hidden = self.dense1(input)
    return self.dense2(hidden)

dd = DoubleDense(3)

# We need to evaluate the layer once to build the weights
trivial_input = tf.ones((1,10))
output = dd(trivial_input)

# Print the names of all variables in the DoubleDense layer
print([weight.name for weight in dd.weights])

Вывод будет таким:

['double_dense_1/kernel:0',
 'double_dense_1/bias:0',
 'double_dense_1/kernel:0',
 'double_dense_1/bias:0']

... но я ожидал чего-то более похожего на это:

['double_dense_1/first_dense_1/kernel:0',
 'double_dense_1/first_dense_1/bias:0',
 'double_dense_1/second_dense_1/kernel:0',
 'double_dense_1/second_dense_1/bias:0']

Итак, Керас назвал эти веса неоднозначно; нет никакого способа определить, принадлежит ли тензор веса к dd.dense1 или dd.dense2 только по его названию. Я понимаю, что мог бы сначала выбрать слой и , а затем веса (dd.dense1.weights), но я бы предпочел не делать этого в моем приложении.

Есть ли способ назвать веса подслоя пользовательского слоя?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...