簡體   English   中英

如何在 Keras 中獲取圖層的權重?

[英]How do I get the weights of a layer in Keras?

我使用的是 Windows 10、Python 3.5 和 tensorflow 1.1.0。 我有以下腳本:

import tensorflow as tf
import tensorflow.contrib.keras.api.keras.backend as K
from tensorflow.contrib.keras.api.keras.layers import Dense

tf.reset_default_graph()
init = tf.global_variables_initializer()
sess =  tf.Session()
K.set_session(sess) # Keras will use this sesssion to initialize all variables

input_x = tf.placeholder(tf.float32, [None, 10], name='input_x')    
dense1 = Dense(10, activation='relu')(input_x)

sess.run(init)

dense1.get_weights()

我收到錯誤: AttributeError: 'Tensor' object has no attribute 'weights'

我做錯了什么,我如何獲得dense1的權重? 我看過thisthis SO post,但我仍然無法讓它工作。

如果你想獲得所有層的權重和偏差,你可以簡單地使用:

for layer in model.layers: print(layer.get_config(), layer.get_weights())

這將打印所有相關信息。

如果您希望權重直接作為 numpy 數組返回,您可以使用:

first_layer_weights = model.layers[0].get_weights()[0]
first_layer_biases  = model.layers[0].get_weights()[1]
second_layer_weights = model.layers[1].get_weights()[0]
second_layer_biases  = model.layers[1].get_weights()[1]

等等。

如果你寫:

dense1 = Dense(10, activation='relu')(input_x)

那么dense1不是一層,而是一層的輸出。 該層為Dense(10, activation='relu')

所以看來你的意思是:

dense1 = Dense(10, activation='relu')
y = dense1(input_x)

這是一個完整的片段:

import tensorflow as tf
from tensorflow.contrib.keras import layers

input_x = tf.placeholder(tf.float32, [None, 10], name='input_x')    
dense1 = layers.Dense(10, activation='relu')
y = dense1(input_x)

weights = dense1.get_weights()

如果您想查看層的權重和偏差如何隨時間變化,您可以添加一個回調來記錄每個訓練時期的值。

例如,使用這樣的模型,

import numpy as np
model = Sequential([Dense(16, input_shape=(train_inp_s.shape[1:])), Dense(12), Dense(6), Dense(1)])

在擬合期間添加回調 **kwarg:

gw = GetWeights()
model.fit(X, y, validation_split=0.15, epochs=10, batch_size=100, callbacks=[gw])

其中回調定義為

class GetWeights(Callback):
    # Keras callback which collects values of weights and biases at each epoch
    def __init__(self):
        super(GetWeights, self).__init__()
        self.weight_dict = {}

    def on_epoch_end(self, epoch, logs=None):
        # this function runs at the end of each epoch

        # loop over each layer and get weights and biases
        for layer_i in range(len(self.model.layers)):
            w = self.model.layers[layer_i].get_weights()[0]
            b = self.model.layers[layer_i].get_weights()[1]
            print('Layer %s has weights of shape %s and biases of shape %s' %(
                layer_i, np.shape(w), np.shape(b)))

            # save all weights and biases inside a dictionary
            if epoch == 0:
                # create array to hold weights and biases
                self.weight_dict['w_'+str(layer_i+1)] = w
                self.weight_dict['b_'+str(layer_i+1)] = b
            else:
                # append new weights to previously-created weights array
                self.weight_dict['w_'+str(layer_i+1)] = np.dstack(
                    (self.weight_dict['w_'+str(layer_i+1)], w))
                # append new weights to previously-created weights array
                self.weight_dict['b_'+str(layer_i+1)] = np.dstack(
                    (self.weight_dict['b_'+str(layer_i+1)], b))

此回調將構建一個包含所有層權重和偏差的字典,並以層數標記,因此您可以看到它們在模型訓練時隨時間的變化。 您會注意到每個權重和偏置數組的形狀取決於模型層的形狀。 為模型中的每一層保存一個權重數組和一個偏置數組。 第三個軸(深度)顯示了它們隨時間的演變。

在這里,我們使用了 10 個 epoch 和一個具有 16、12、6 和 1 個神經元層的模型:

for key in gw.weight_dict:
    print(str(key) + ' shape: %s' %str(np.shape(gw.weight_dict[key])))

w_1 shape: (5, 16, 10)
b_1 shape: (1, 16, 10)
w_2 shape: (16, 12, 10)
b_2 shape: (1, 12, 10)
w_3 shape: (12, 6, 10)
b_3 shape: (1, 6, 10)
w_4 shape: (6, 1, 10)
b_4 shape: (1, 1, 10)

如果圖層索引號令人困惑,您也可以使用圖層名稱

重量

model.get_layer(<<layer_name>>).get_weights()[0]

偏見

model.get_layer(<<layer_name>>).get_weights()[1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM