【问题标题】:How do I get weights and biases from my model?如何从我的模型中获得权重和偏差?
【发布时间】:2019-07-02 14:52:18
【问题描述】:

我有一个简单的神经网络,我需要从模型中获取权重和偏差。我已经尝试过之前讨论过的一些方法,但我不断收到超出范围的值错误。不知道如何解决这个问题,或者我错过了什么。

网络-

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

model.layers[0].get_weights()[1]

错误 - IndexError: list index out of range

这是在几个问题中提到的,但我最终得到了超出范围的错误。

我还有个问题,model.layers[]后面跟的索引,是不是对应层? 比如model.layers[1]给出第二层对应的权重,类似这样?

【问题讨论】:

    标签: python keras


    【解决方案1】:

    我去过那里,我一直在查看我的旧代码,看看我是否记得我是如何解决这个问题的。 我所做的是打印model.layer[index].get_weights()[X] 的长度,以找出 keras 在哪里节省了我需要的权重。 在我的旧代码中,model.layers[0].get_weights()[1] 将返回偏差,而 model.layers[0].get_weights()[0] 将返回实际权重。 在任何情况下,考虑到有些层没有保存权重(因为它们没有权重),所以如果要求model.layers[0].get_weights()[0] 不起作用,请尝试使用model.layers[1].get_weights()[1],因为我不是肯定会展平层,但我确实知道密集层应该节省它们的权重。

    【讨论】:

    • 如果对您有帮助,您可以在我的旧代码末尾查看 cmets [github.com/abeagomez/CNN_triplet_loss_with_keras/blob/master/…
    • 如果您需要每个 epoch 后的权重,也可以使用它 [stackoverflow.com/questions/46473823/…
    • 嘿,谢谢!所以,比如说我运行了 5 个 epoch - 我最后得到的权重和偏差显然基本上是第 5 个 epoch 的权重和偏差,对吧?此外,我设法让它工作 - 我想。 model.layers[1].get_weights()[0] 给了我一个多维数组,每个子数组有 10 个元素,对于model.layers[1].get_weights()[1] 我得到一个数组...所以我假设后者是偏差,前者是权重(因为我有 10 个类)。有意义吗?
    • @AdityaDas 完全正确!后者是偏差,前者是权重,是的,你最后得到的权重和偏差来自你的最后一个时期,我只提供了额外的信息,以防你想看看你的权重在训练期间的样子: )
    【解决方案2】:

    模型中的第一层(索引 0)是 Flatten 层,它没有任何权重,这就是您得到错误的原因。

    要获得Dense层,也就是第二层,你必须使用索引1:

    model.layers[1].get_weights()[1]
    

    【讨论】:

    • 如果我们有多个密集层?对于第二个密集层(第三个整体层),我们将使用model.layers[2].get_weights()[2]
    • @AdityaDas 是的,图层的索引就像任何数组一样
    【解决方案3】:

    只需model.get_weights(),您将获得模型的所有权重和偏差

    【讨论】:

      【解决方案4】:

      要获得 Keras 序列和每次迭代的权重和偏差,您可以按照下一个示例进行操作:

      # create model
      model = Sequential()
      model.add(Dense(numHiddenNeurons, activation="tanh", input_dim=4, kernel_initializer="uniform"))
      model.add(Dense(1, activation="linear", kernel_initializer="uniform"))
      # Compile model
      model.compile(loss='mse', optimizer='adam', metrics=['accuracy', 'mse', 'mae', 'mape'])
      weightsBiasDict = {}
          
      weightAndBiasCallback = tf.keras.callbacks.LambdaCallback \
                  (on_epoch_end=lambda epoch, logs: weightsBiasDict.update({epoch:model.get_weights()}))
          
      # Fit the model
      history= model.fit(X1, Y1, epochs=numIterations, batch_size=batch_size,  verbose=0, callbacks=weightAndBiasCallback)
      

      字典weightsBiasDict上的每次迭代都可以访问权重和偏差

      如果您在训练结束时只需要权重和偏差值,您可以使用 model.layer[index].get_weights()[0] 权重 和 model.layer[index].get_weights()[1] 用于偏见 其中index 是网络上的层号,输入层从零开始。

      【讨论】:

        猜你喜欢
        • 2018-10-20
        • 2019-11-18
        • 2017-12-14
        • 2019-12-29
        • 1970-01-01
        • 2020-02-01
        • 2019-02-06
        • 1970-01-01
        • 2017-06-22
        相关资源
        最近更新 更多