【问题标题】:Keras rename model and layersKeras 重命名模型和图层
【发布时间】:2018-09-08 01:32:16
【问题描述】:

1) 我尝试使用 TF 后端重命名 Keras 中的模型和层,因为我在一个脚本中使用多个模型。 类模型似乎具有属性 model.name,但是在更改它时我得到“AttributeError:无法设置属性”。 这里有什么问题?

2) 另外,我正在使用顺序 API,我想为层命名,这似乎可以使用功能 API,但我没有找到顺序 API 的解决方案。有谁知道顺序 API 怎么做?

更新到 2):命名图层是可行的,尽管它似乎没有记录。只需添加参数名称,例如model.add(Dense(...,...,name="hiddenLayer1")。注意,同名层共享权重!

【问题讨论】:

标签: python keras


【解决方案1】:

为了在 Tensorflow Keras 上更改预训练模型的层名称,解决方案有点复杂。一个简单的 其他答案提出的layer.name = "new_name"layer._name = "new_name" 将不起作用。

This blog post 提供了适用于这种情况的解决方案。

【讨论】:

    【解决方案2】:

    要仅更改模型中的一个层名称,您可以使用以下行:

    my_model.layers[0]._name = 'my_new_name_for_the_first_layer'
    my_model.layers[1]._name = 'my_new_name_for_the_second_layer'
    my_model.layers[-1]._name = 'my_new_name_for_the_last_layer'
    

    【讨论】:

      【解决方案3】:

      在 TF2.2.0 中重命名 keras 模型:

      model._name = "newname"

      我不知道这是不是一个坏主意——他们似乎不想让你这样做,但它确实有效。要确认,请致电model.summary(),您应该会看到新名称。

      【讨论】:

        【解决方案4】:

        详细答案在这里How to rename Pre-Trained model ? ValueError 'Trained Model' is not a valid scope name

        我们可以在开发模型并准备训练时使用model.name = "Model_Name"。我们也可以给图层命名。例如:

        model = Sequential()
        model.name = "My_Model" #Naming model
        model.add(Dense(2,input_shape=(...),name="Name") #Naming layer
        

        【讨论】:

          【解决方案5】:

          要使用 tf.keras 更改 model.layers 的名称,您可以使用以下几行:

          for layer in model.layers:
              layer._name = layer.name + str("_2")
          

          我在双输入模型案例中需要这个,并且也遇到了“AttributeError:无法设置属性”。问题是有一个潜在的隐藏属性_name,这会导致冲突。

          【讨论】:

          • 谢谢.. 我用._name 代替.name 并且有效。
          • 在 TF 2.3 的 tf.keras 中仍然有效。虽然这也可以通过 RNN 单元完成,但请注意,如果删除原始名称的后缀(计算层数的 int,例如 rnn_layer_3),双向层和其他一些东西可能会出现一些错误。
          • 即使它现在可以工作:这不是公共 API,如果开发人员更改底层实现,它可能会静默失败。此外,层权重的名称没有重命名,这可能会导致训练后保存模型时发生冲突。
          【解决方案6】:

          只是为了涵盖所有选项,关于问题的标题,如果您使用 Keras 功能 API,您可以通过以下方式定义模型和层名称:

          inputs = Input(shape=(value, value))
          
          output_layer = Dense(2, activation = 'softmax', name = 'training_output')(dropout_new_training_layer)
          
          model = Model(inputs= inputs, outputs=output_layer, name="my_model")
          

          【讨论】:

            【解决方案7】:

            来自 user239457 的 Answer 仅适用于 Standard keras

            如果你想使用Tensorflow Keras,你可以这样做:

            from tensorflow.keras.models import Sequential
            from tensorflow.keras.layers import Dense
            
            model = Sequential(name='Name')
            model.add(Dense(2,input_shape=(5, 1)))
            

            【讨论】:

              【解决方案8】:

              对于 1),我认为您可以构建另一个名称正确且结构与现有模型相同的模型。然后将权重从现有模型的层设置到新模型的层。

              【讨论】:

                【解决方案9】:

                关于型号名称的第一个问题在我的机器上无法重现。 我可以这样设置。很多时候这些错误是由软件版本引起的。

                model=Sequential()
                model.add(Dense(2,input_shape=(....)))
                model.name="NAME"
                

                至于命名层,你可以像这样在顺序模型中这样做

                model=Sequential()
                model.add(Dense(2,input_shape=(...),name="NAME"))
                

                【讨论】:

                • 感谢您的回答!正如更新中已经说过的,我找到了该层的解决方案。但是 model.name 仍然无法正常工作。不过谢谢你,我认为你的回答是正确的!
                • model.name 使用属性装饰器并且不能被覆盖。不过属性model._name 可以。
                猜你喜欢
                • 2020-02-13
                • 1970-01-01
                • 2021-07-17
                • 2019-03-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多