Keras 2.x - Получить вес слоя
Я использую 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
? Я смотрю на эту и эту должность, но я все еще не могу заставить ее работать.
Ответы
Ответ 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()
Ответ 2
Если вы хотите получить веса и смещения всех слоев, вы можете просто использовать:
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]
и т.п.
Ответ 3
Если вы хотите увидеть, как веса и смещения вашего слоя меняются со временем, вы можете добавить обратный вызов для записи их значений в каждую эпоху обучения.
Используя такую модель, например,
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 эпох и модель со слоями из 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)