Saya menggunakan Windows 10, Python 3.5, dan tensorflow 1.1.0. Saya memiliki skrip berikut:
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()
Saya mendapatkan error: AttributeError: 'Tensor' object has no attribute 'weights'
Apa yang saya lakukan salah, dan bagaimana saya mendapatkan bobot dari dense1
? Saya telah melihat this dan this SO post, tetapi saya masih tidak bisa membuatnya bekerja.
Jika Anda ingin mendapatkan bobot dan bias dari semua lapisan, Anda bisa menggunakan:
for layer in model.layers: print(layer.get_config(), layer.get_weights())
Ini akan mencetak semua informasi yang relevan.
Jika Anda ingin bobot langsung dikembalikan sebagai array numpy, Anda dapat menggunakan:
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]
dll.
Jika Anda menulis:
dense1 = Dense(10, activation='relu')(input_x)
Maka dense1
bukanlah sebuah layer, melainkan output dari sebuah layer. Layernya adalah Dense(10, activation='relu')
Jadi sepertinya yang Anda maksudkan:
dense1 = Dense(10, activation='relu')
y = dense1(input_x)
Berikut ini cuplikan lengkapnya:
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()
Jika Anda ingin melihat bagaimana bobot dan bias layer Anda berubah seiring waktu, Anda dapat menambahkan callback untuk merekam nilainya pada setiap epoch pelatihan.
Menggunakan model seperti ini misalnya,
import numpy sebagai np
model = Sequential([Dense(16, input_shape=(train_inp_s.shape[1:])), Dense(12), Dense(6), Dense(1)])
tambahkan callback **kwarg selama fitting:
gw = GetWeights()
model.fit(X, y, validation_split=0.15, epochs=10, batch_size=100, callbacks=[gw])
dimana callback didefinisikan oleh
kelas GetWeights(Callback):
# Keras callback yang mengumpulkan nilai bobot dan bias pada setiap epoch
def __init__(self):
super(GetWeights, self).__init__()
self.weight_dict = {}
def on_epoch_end(self, epoch, logs=None):
# fungsi ini berjalan di akhir setiap epoch
# loop atas setiap layer dan mendapatkan bobot dan bias
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_weight()[1]
print('Layer %s memiliki bobot bentuk %s dan bias bentuk %s' %(
layer_i, np.shape(w), np.shape(b)))
# simpan semua bobot dan bias di dalam kamus
if epoch == 0:
# buat array untuk menyimpan bobot dan bias
self.weight_dict['w_'+str(layer_i+1)] = w
self.weight_dict['b_'+str(layer_i+1)] = b
else:
# tambahkan bobot baru ke array bobot yang telah dibuat sebelumnya
self.weight_dict['w_'+str(layer_i+1)] = np.dstack(
(self.weight_dict['w_'+str(layer_i+1)], w))
# tambahkan bobot baru ke array bobot yang telah dibuat sebelumnya
self.weight_dict['b_'+str(layer_i+1)] = np.dstack(
(self.weight_dict['b_'+str(layer_i+1)], b))
Callback ini akan membangun kamus dengan semua bobot dan bias layer, diberi label dengan nomor layer, sehingga Anda dapat melihat bagaimana mereka berubah seiring waktu saat model Anda sedang dilatih. Anda akan melihat bentuk dari setiap bobot dan bias array tergantung pada bentuk layer model. Satu susunan bobot dan satu susunan bias disimpan untuk setiap lapisan dalam model Anda. Sumbu ketiga (kedalaman) menunjukkan evolusi mereka dari waktu ke waktu.
Di sini kami menggunakan 10 epoch dan model dengan lapisan 16, 12, 6, dan 1 neuron:
untuk kunci dalam gw.weight_dict:
print(str(key) + ' shape: %s' %str(np.shape(gw.weight_dict[key])))
bentuk w_1: (5, 16, 10)
b_1 bentuk: (1, 16, 10)
bentuk w_2: (16, 12, 10)
b_2 bentuk: (1, 12, 10)
bentuk w_3: (12, 6, 10)
bentuk b_3: (1, 6, 10)
bentuk w_4: (6, 1, 10)
bentuk b_4: (1, 1, 10)