2016-11-08 8 views
3

Ich möchte die Gewichte aller Ebenen in meinem Keras (Deep Learning) Modell zurücksetzen (randomisieren). Der Grund ist, dass ich in der Lage sein möchte, das Modell mehrmals mit verschiedenen Datenaufteilungen zu trainieren, ohne jedes Mal die (langsame) Neukompilierung des Modells vornehmen zu müssen.Gewichte in Keras Ebene zurücksetzen

Inspiriert von this discussion, ich versuche, den folgenden Code:

# Reset weights 
for layer in KModel.layers: 
    if hasattr(layer,'init'): 
     input_dim = layer.input_shape[1] 
     new_weights = layer.init((input_dim, layer.output_dim),name='{}_W'.format(layer.name)) 
     layer.trainable_weights[0].set_value(new_weights.get_value()) 

Es ist jedoch nur teilweise funktioniert.

Teilweise, weil ich einige layer.get_weights() Werte überprüft habe, und sie scheinen sich zu ändern. Aber wenn ich das Training neu starte, sind die Kostenwerte viel niedriger als die anfänglichen Kostenwerte beim ersten Lauf. Es ist fast so, als ob ich einige der Gewichte zurücksetzen konnte, aber nicht alle.

Irgendwelche Tipps, wo ich falsch liege, würden sehr geschätzt werden. Thx ..

Antwort

4

Was ist, wenn Sie die ersten Gewichte rechts nach dem Kompilieren des Modells gespeichert, aber bevor sie die Ausbildung:

model.save_weights('model.h5') 

und dann nach dem Training, „Reset“ das Modell durch die Ausgangsgewichte Nachladen:

model.load_weights('model.h5') 

Dies gibt Ihnen ein Apfel zu Apfel-Modell, um verschiedene Datensätze zu vergleichen und sollte schneller sein als das gesamte Modell neu kompilieren.

+2

Ich landete etwas ähnliches. Das Speichern auf Festplatte und das Laden dauert sehr lange, daher behalte ich die Gewichte einfach in einer Variablen: weights = model.get_weights() Ich bekomme die anfänglichen Gewichte wie diese, bevor ich das erste Training durchführe. Dann, vor jedem weiteren Training, lade ich die Anfangsgewichte neu und führe jkleints Shuffle-Methode aus, wie in dem von mir geposteten Link erwähnt. Scheint reibungslos zu funktionieren .. – Tor

0

OK, so scheint es jemand anderes hatte das gleiche Problem. Eine nette Lösung, die das Problem (für alle praktischen Zwecke) löst, wurde hier veröffentlicht: https://gist.github.com/jkleint/eb6dc49c861a1c21b612b568dd188668

+0

Diese Lösung reinitialisiert nicht tatsächlich die Gewichtungen, sondern permutiert nur die Elemente in der Gewichtungsmatrix. Dies funktioniert nur unter bestimmten Bedingungen (z. B. Wertverteilung ist in allen Dimensionen gleich) und sollte wahrscheinlich in einem unsichereren Szenario vermieden werden. – ldavid

+0

Hinweis: Mein Kommentar oben ist falsch, wenn 'shuffle_weights (weights = initial_weights)' mit den Gewichten aufgerufen wird, die vor Beginn des Trainings ermittelt wurden. – ldavid

1

Versuchen set_weights.

zum Beispiel:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
from __future__ import print_function 
import numpy as np 
np.random.seed(1234) 
from keras.layers import Input 
from keras.layers.convolutional import Convolution2D 
from keras.models import Model 

print("Building Model...") 
inp = Input(shape=(1,None,None)) 
x = Convolution2D(1, 3, 3, border_mode='same', init='normal',bias=False)(inp) 
output = Convolution2D(1, 3, 3, border_mode='same', init='normal',bias=False)(x) 
model_network = Model(input=inp, output=output) 

w = np.asarray([ 
    [[[ 
    [0,0,0], 
    [0,2,0], 
    [0,0,0] 
    ]]] 
    ]) 

for layer_i in range(len(model_network.layers)): 
    print (model_network.layers[layer_i]) 

for layer_i in range(1,len(model_network.layers)): 
    model_network.layers[layer_i].set_weights(w) 



input_mat = np.asarray([ 
    [[ 
    [1.,2.,3.,10.], 
    [4.,5.,6.,11.], 
    [7.,8.,9.,12.] 
    ]] 
    ]) 

print("Input:") 
print(input_mat) 
print("Output:") 
print(model_network.predict(input_mat)) 

w2 = np.asarray([ 
    [[[ 
    [0,0,0], 
    [0,3,0], 
    [0,0,0] 
    ]]] 
    ]) 


for layer_i in range(1,len(model_network.layers)): 
    model_network.layers[layer_i].set_weights(w2) 

print("Output:") 
print(model_network.predict(input_mat)) 

bauen ein Modell mit etwa zwei Faltungsschichten

print("Building Model...") 
inp = Input(shape=(1,None,None)) 
x = Convolution2D(1, 3, 3, border_mode='same', init='normal',bias=False)(inp) 
output = Convolution2D(1, 3, 3, border_mode='same', init='normal',bias=False)(x) 
model_network = Model(input=inp, output=output) 

dann definieren Sie Ihre Gewichte (i w eine einfache bin mit, aber man konnte np.random verwenden .uniform oder ähnliches, wenn Sie möchten)

w = np.asarray([ 
    [[[ 
    [0,0,0], 
    [0,2,0], 
    [0,0,0] 
    ]]] 
    ]) 

Werfen Sie einen Blick auf die Schichten in einem Modell

for layer_i in range(len(model_network.layers)): 
    print (model_network.layers[layer_i]) 

Sets jedes Gewicht für jede Faltungsschicht (Sie, dass die erste Schicht tatsächlich Eingang sehen werden und Sie nicht wollen, das ändern, deshalb beginnt der Bereich von 1 nicht Null).

for layer_i in range(1,len(model_network.layers)): 
    model_network.layers[layer_i].set_weights(w) 

generieren eine Eingabe für den Test und Vorhersage der Ausgabe von Ihrem Modell

input_mat = np.asarray([ 
    [[ 
    [1.,2.,3.,10.], 
    [4.,5.,6.,11.], 
    [7.,8.,9.,12.] 
    ]] 
    ]) 

print("Output:") 
print(model_network.predict(input_mat)) 

Man könnte es wieder ändern, wenn Sie wollen, und prüfen Sie erneut für die Ausgabe:

w2 = np.asarray([ 
    [[[ 
    [0,0,0], 
    [0,3,0], 
    [0,0,0] 
    ]]] 
    ]) 

for layer_i in range(1,len(model_network.layers)): 
    model_network.layers[layer_i].set_weights(w2) 

print("Output:") 
print(model_network.predict(input_mat)) 

Probe Ausgabe:

Using Theano backend. 
Building Model... 
<keras.engine.topology.InputLayer object at 0x7fc0c619fd50> 
<keras.layers.convolutional.Convolution2D object at 0x7fc0c6166250> 
<keras.layers.convolutional.Convolution2D object at 0x7fc0c6150a10> 
Weights after change: 
[array([[[[ 0., 0., 0.], 
     [ 0., 2., 0.], 
     [ 0., 0., 0.]]]], dtype=float32)] 
Input: 
[[[[ 1. 2. 3. 10.] 
    [ 4. 5. 6. 11.] 
    [ 7. 8. 9. 12.]]]] 
Output: 
[[[[ 4. 8. 12. 40.] 
    [ 16. 20. 24. 44.] 
    [ 28. 32. 36. 48.]]]] 
Output: 
[[[[ 9. 18. 27. 90.] 
    [ 36. 45. 54. 99.] 
    [ 63. 72. 81. 108.]]]] 

Von Ihrem Blick auf .layers können Sie sehen, dass die erste Schicht eingegeben wird und die anderen Ihre Faltungsschichten.

Verwandte Themen