亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在自定義層中命名層的權重

在自定義層中命名層的權重

慕森王 2022-07-12 17:55:48
我在密集子層中有一個自定義層。我希望能夠命名這個子層的權重。但是,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 weightstrivial_input = tf.ones((1,10))output = dd(trivial_input)# Print the names of all variables in the DoubleDense layerprint([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']因此,Keras 模糊地命名了這些權重;沒有辦法判斷一個權重張量是屬于它的dd.dense1還是dd.dense2僅僅通過它的名字。我意識到我可以先選擇圖層,然后選擇權重 ( dd.dense1.weights),但我不想在我的應用程序中這樣做。有沒有辦法命名自定義層的子層的權重?
查看完整描述

1 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

如果您想要子類層的名稱,則需要包含name_scope然后調用build每個層。


下面是修改后的代碼,它將為輸出中的每一層命名。


class DoubleDense(keras.layers.Layer):

  def __init__(self, units, **kwargs):

    self.dense1 = keras.layers.Dense(units)

    self.dense2 = keras.layers.Dense(units)

    super(DoubleDense, self).__init__( **kwargs)


  def build(self, input_shape):

    with tf.name_scope("first_dense"):

      self.dense1.build(input_shape)

    with tf.name_scope("second_dense"):

      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/first_dense/kernel:0', 'double_dense/first_dense/bias:0', 'double_dense/second_dense/kernel:0', 'double_dense/second_dense/bias:0']  

希望這能回答你的問題,快樂學習!


查看完整回答
反對 回復 2022-07-12
  • 1 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號